home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Development / 3DMF parser / 1.0 version / MF3DPC / MFOBJECT.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-07  |  227.6 KB  |  8,939 lines  |  [TEXT/dosa]

  1. /*==============================================================================
  2.  *
  3.  *    File:        MFOBJECT.C
  4.  *
  5.  *    Function:    Object read/write
  6.  *
  7.  *    Version:    Metafile:    Version 1.0 3DMF files
  8.  *                Package:    Release #2 of this code
  9.  *
  10.  *    Author(s):    Rick Wong (RWW), Duet Development Corp.
  11.  *                John Kelly (JRK), Duet Development Corp.
  12.  *
  13.  *    Copyright:    (c) 1995 by Apple Computer, Inc., all rights reserved.
  14.  *
  15.  *    Change History (most recent first):
  16.  *        FB7_JRK    Pragma macros
  17.  *        FB4_JRK    Parse object types we don't understand
  18.  *        FB3_JRK    Added UnknownBinary (ukbn)
  19.  *        Fabio    Changed file name to 8 characters
  20.  *        F3K_RWW    GeneralPolygonHint.
  21.  *        F3G_RWW    User-defined objects.
  22.  *        F3A_RWW    MeshEdges and OrientationStyle.
  23.  *        F2S_RWW    BeginGroup changes.
  24.  *        F2R_RWW    Change to simple object theory.
  25.  *        F2H_RWW    File created.
  26.  *==============================================================================
  27.  */
  28.  
  29. #include "MFOBJECT.H"
  30.  
  31. #include <string.h>            /* memcpy */
  32.  
  33. #include "MF3D.H"
  34. #include "MFERRORS.H"
  35. #include "MFINT64.H"
  36. #include "MFOBJCTS.H"
  37. #include "MFASSERT.H"
  38. #include "MFGROUPS.H"
  39. #include "MFINTOBJ.H"
  40. #include "MFMACROS.H"
  41. #include "MFMEMORY.H"
  42. #include "MFOBJTYP.H"
  43. #include "MFPRIMTV.H"
  44. #include "MFRSLNTN.H"
  45. #include "MFTEXTST.H"
  46. #include "MFTEXTWR.H"    /* MF3D_WriteNewLine */
  47.  
  48. #if defined(applec) || defined(__MWERKS__) || defined(THINK_C)
  49. #pragma segment __MFOBJECT1__
  50. #endif
  51.  
  52. /*==============================================================================
  53.  *    MF3D_VerifyObject
  54.  *==============================================================================
  55.  */
  56. #define    MF3D_VerifyObjectType(inObj, inObjType)                                \
  57.     MFASSERT(inObj != NULL && inObj->objectType == inObjType);
  58.  
  59.  
  60. /*==============================================================================
  61.  *    MF3D_IntReadObject
  62.  *
  63.  *    Moved out of ReadAnObject to support BeginGroup()
  64.  *
  65.  *    Sets *outMF3DObjPtr to NULL on failure.
  66.  *==============================================================================
  67.  */
  68. MF3DErr
  69. MF3D_IntReadObject(
  70.     MF3D_FilePtr    inMF3DFilePtr,        /* In:  MF3D file structure            */
  71.     MF3DVoidObjPtr    *outMF3DObjPtr)        /* Out: metafile object                */
  72. {
  73.     MF3DObjType                objType;
  74.     MF3D_ObjStuffPtr        objStuff;
  75.     MF3DReferenceID            objRefID;
  76.     MF3DVoidObjPtr            object;
  77.     MF3DBoolean                objTypeIsValid;
  78.     MF3DErr                    result;
  79.  
  80.     objTypeIsValid = kMF3DBooleanFalse;
  81.     result = MF3D_BeginRead(inMF3DFilePtr, &objStuff, &objRefID, &objType);
  82.  
  83.     if (result == kMF3DNoErr)
  84.     {    objTypeIsValid = kMF3DBooleanTrue;
  85.         result = (*objStuff->reader) (inMF3DFilePtr, &object);
  86.     }
  87.  
  88.     /* Special setup for User-created objects */
  89.     /* FB4_JRK */
  90.     /* Unknown objects fail to convert, and we allow them to be parsed */
  91.     if (result == kMF3DNoErr && objStuff->type == kMF3DObjUnknownType)
  92.     {    ((MF3DUnknownObjPtr)object)->realObjectType = objType;
  93.         result = MF3D_ConvertUserDefinedObjType(inMF3DFilePtr, objType,
  94.             &(((MF3DUnknownObjPtr)object)->realObjectName));
  95.         objType = kMF3DObjUnknownType;
  96.         if (result == kMF3DErrIllegalObjName)
  97.             result = kMF3DNoErr;
  98.     }
  99.  
  100.     if (result == kMF3DNoErr && object != NULL)
  101.     {    object->objectType = objType;
  102.         if (objRefID != 0 && objType != kMF3DObjTableOfContents)
  103.         {    MF3D_Allocate(object->refInfo);
  104.             if (result == kMF3DNoErr)
  105.             {    object->refInfo->refID = objRefID;
  106.                 object->refInfo->refName = MF3D_GetRefName(
  107.                         inMF3DFilePtr, objRefID);
  108.             }
  109.         }
  110.         else
  111.             object->refInfo = NULL;
  112.     }
  113.  
  114.     /*
  115.      * The only excuse for this small series of special-case tests
  116.      * is that we cannot seem to think of a reasonable alternative
  117.      * at the moment. One option that would alleviate the IsTextFormat
  118.      * test is to read binary files in smaller chunks (like we read
  119.      * the text files), but since that is not a trivial change and
  120.      * would slow the speed of reading binary files, we opt not to
  121.      * do that for now.
  122.      */
  123.     if (result == kMF3DNoErr)
  124.     {    if (objType != kMF3DObjContainer)
  125.         {    result = MF3D_EndRead(inMF3DFilePtr);
  126.         }
  127.         else if (MF3DIsTextFormat(inMF3DFilePtr->dataFormat))
  128.         {    /* After reading a text container, we still have to dispose
  129.              * of the readBuffer.
  130.              */
  131.             /* We should be the end of the object, free the buffer */
  132.             MFASSERT(inMF3DFilePtr->readBuffer.buf[
  133.                     inMF3DFilePtr->readBuffer.bufPos] == '\0');
  134.             MFASSERT(inMF3DFilePtr->readBuffer.bufPos ==
  135.                     inMF3DFilePtr->readBuffer.bufSize);
  136.             MF3D_Free(inMF3DFilePtr->readBuffer.buf);
  137.             inMF3DFilePtr->readBuffer.buf = NULL;
  138.         }
  139.     }
  140.  
  141.     /* JRK */
  142.     /* We no longer get rid of buffer if we get an error reading the object
  143.      * This is now the responsibility of the caller. Some people (notably
  144.      * BeginGroup) call this expecting errors if optional objects aren't present.
  145.      *
  146.      * The code used to be:
  147.      *
  148.      *        if (result != kMF3DNoErr)
  149.      *        {    MF3D_Free(inMF3DFilePtr->readBuffer.buf);
  150.      *                inMF3DFilePtr->readBuffer.buf = NULL;
  151.      *        }    
  152.      */
  153.  
  154.     /* Note that we do this anyway in the error case */
  155.     if ((objTypeIsValid == kMF3DBooleanTrue || result == kMF3DNoMoreObjects) &&
  156.             inMF3DFilePtr->resStuff.resState >= MF3D_ResolvingReference)
  157.     {    if (objTypeIsValid == kMF3DBooleanTrue)
  158.         {    switch (objType)
  159.             {    case kMF3DObjBeginGroup:
  160.                 case kMF3DObjContainer:
  161.                     ++inMF3DFilePtr->resStuff.resState;
  162.                     break;
  163.                 case kMF3DObjEndGroup:
  164.                 case kMF3DObjEndContainer:    /* Actually, we will not get this */
  165.                     --inMF3DFilePtr->resStuff.resState;
  166.                     break;
  167.             }
  168.         }
  169.         if (result == kMF3DNoMoreObjects ||
  170.                 inMF3DFilePtr->resStuff.resState == MF3D_ResolvingReference)
  171.         {    MFASSERT(inMF3DFilePtr->resStuff.resState >=
  172.                     MF3D_ResolvingReference);
  173.             /* Reset back to original file pointer */
  174.             result = MF3D_PopResolution(inMF3DFilePtr);
  175.         }
  176.     }
  177.  
  178.     if (result == kMF3DNoErr)
  179.         *outMF3DObjPtr = object;
  180.     else
  181.         *outMF3DObjPtr = NULL;
  182.  
  183.     return result;
  184. }
  185.  
  186. /*==============================================================================
  187.  *    MF3D_ObjMetafileReader
  188.  *==============================================================================
  189.  */
  190. MF3DErr
  191. MF3D_ObjMetafileReader(
  192.     MF3D_FilePtr    inMetafilePtr,
  193.     MF3DVoidObjPtr    *outObj)
  194. {
  195.     MF3DMetafileObjPtr        returnObj;
  196.     MF3DErr                    result;
  197.  
  198.     result = kMF3DNoErr;
  199.  
  200.     MF3D_Allocate(returnObj);
  201.  
  202.     if (result == kMF3DNoErr)
  203.     {    returnObj->dataFormat = inMetafilePtr->dataFormat;
  204.         result = MF3D_Uns16Read(inMetafilePtr, &returnObj->majorVersion);
  205.     }
  206.  
  207.     if (result == kMF3DNoErr)
  208.         result = MF3D_Uns16Read(inMetafilePtr, &returnObj->minorVersion);
  209.  
  210.     if (result == kMF3DNoErr)
  211.     {    result = MF3D_FlagsRead(inMetafilePtr, gMF3D_MetafileFlags,
  212.                 &returnObj->flags);
  213.     }
  214.  
  215.     /* Read the TOC ptr */
  216.     if (result == kMF3DNoErr)
  217.         MF3D_Allocate(returnObj->tocLocation);
  218.  
  219.     if (result == kMF3DNoErr)
  220.         result = MF3D_RefRead(inMetafilePtr, returnObj->tocLocation);
  221.  
  222.     if (result == kMF3DNoErr)
  223.     {    /* As read from the Tables of Contents */
  224.         returnObj->refSeed = inMetafilePtr->tocStuff.refSeed;
  225.         returnObj->typeSeed = inMetafilePtr->tocStuff.typeSeed;
  226.     }
  227.  
  228.     if (result == kMF3DNoErr)
  229.         *outObj = (MF3DVoidObjPtr) returnObj;
  230.     else
  231.         MF3D_Free(returnObj);
  232.  
  233.     /* We don't support versions prior to release (1.0) */
  234.     if (result == kMF3DNoErr && returnObj->majorVersion < 1)
  235.         result = kMF3DErrUnsupportedMetafileFormat;
  236.  
  237.     /* Check for valid version? */
  238.     if (result == kMF3DNoErr &&
  239.             (returnObj->majorVersion > kMF3DVersionMajor ||
  240.                 (returnObj->majorVersion == kMF3DVersionMajor &&
  241.                  returnObj->minorVersion > kMF3DVersionMinor)))
  242.     {    result = kMF3DWarnNewerMetafileFormat;
  243.     }
  244.  
  245.     return result;
  246. }
  247.  
  248. /*==============================================================================
  249.  *    MF3D_ObjMetafileWriter
  250.  *==============================================================================
  251.  */
  252. MF3DErr
  253. MF3D_ObjMetafileWriter(
  254.     MF3D_FilePtr    inMetafilePtr,
  255.     MF3DVoidObjPtr    inObj)
  256. {
  257.     MF3DMetafileObjPtr    writeObj;
  258.     MF3DErr                result;
  259.  
  260.     result = kMF3DNoErr;
  261.  
  262.     MF3D_VerifyObjectType(inObj, kMF3DObjMetafile);
  263.     writeObj = (MF3DMetafileObjPtr)inObj;
  264.  
  265.     if (writeObj->refSeed > inMetafilePtr->tocStuff.refSeed)
  266.     {    if (writeObj->refSeed > kMF3DMaximumRefSeed)
  267.             result = kMF3DErrIllegalRefID;
  268.         inMetafilePtr->tocStuff.refSeed = writeObj->refSeed;
  269.     }
  270.  
  271.     if (writeObj->typeSeed < inMetafilePtr->tocStuff.typeSeed)
  272.     {    if (writeObj->typeSeed < kMF3DMinimumTypeSeed)
  273.             result = kMF3DErrIllegalUserObjectType;
  274.         inMetafilePtr->tocStuff.typeSeed = writeObj->typeSeed;
  275.     }
  276.  
  277.     if (result == kMF3DNoErr)
  278.         result = MF3D_Uns16Write(inMetafilePtr, kMF3DVersionMajor);
  279.  
  280.     if (result == kMF3DNoErr)
  281.         result = MF3D_Uns16Write(inMetafilePtr, kMF3DVersionMinor);
  282.  
  283.     if (result == kMF3DNoErr)
  284.     {    result = MF3D_FlagsWrite(inMetafilePtr, gMF3D_MetafileFlags,
  285.                 ((MF3DMetafileObjPtr)inObj)->flags);
  286.     }
  287.  
  288.     if (result == kMF3DNoErr)
  289.     {    result = MF3D_TOCRefWrite(inMetafilePtr,
  290.                 ((MF3DMetafileObjPtr)inObj)->tocLocation);
  291.     }
  292.  
  293.     return result;
  294. }
  295.  
  296. /*==============================================================================
  297.  *    MF3D_ObjMetafileDisposer
  298.  *==============================================================================
  299.  */
  300. MF3DErr
  301. MF3D_ObjMetafileDisposer(
  302.     MF3DVoidObjPtr    inObj)
  303. {
  304.     MF3DErr    result;
  305.  
  306.     result = kMF3DNoErr;
  307.  
  308.     MF3D_VerifyObjectType(inObj, kMF3DObjMetafile);
  309.  
  310.     if (inObj != NULL)
  311.     {    result = MF3D_PositionReferenceDisposer(
  312.                 ((MF3DMetafileObjPtr)inObj)->tocLocation);
  313.         MF3D_Free(((MF3DMetafileObjPtr)inObj)->tocLocation);
  314.         MF3D_Free(inObj);
  315.     }
  316.     return result;
  317. }
  318.  
  319. /*==============================================================================
  320.  *    MF3D_ObjContainerReader
  321.  *==============================================================================
  322.  */
  323. MF3DErr
  324. MF3D_ObjContainerReader(
  325.     MF3D_FilePtr    inMetafilePtr,
  326.     MF3DVoidObjPtr    *outObj)
  327. {
  328.     MF3DContainerObjPtr        containerObj;
  329.     MF3DErr                    result;
  330.  
  331.     result = kMF3DNoErr;
  332.  
  333.     MF3D_Allocate(containerObj);
  334.  
  335.     if (result == kMF3DNoErr)
  336.     {    ++inMetafilePtr->inContainer;
  337.         *outObj = (MF3DVoidObjPtr) containerObj;
  338.     }
  339.  
  340.     return result;
  341. }
  342.  
  343. /*==============================================================================
  344.  *    MF3D_ObjContainerWriter
  345.  *==============================================================================
  346.  */
  347. MF3DErr
  348. MF3D_ObjContainerWriter(
  349.     MF3D_FilePtr    inMetafilePtr,
  350.     MF3DVoidObjPtr    inObj)
  351. {
  352.     MF3D_VerifyObjectType(inObj, kMF3DObjContainer);
  353.  
  354.     MF3D_Unused(inMetafilePtr);
  355.     MF3D_Unused(inObj);
  356.     /* Nothing to write! */
  357.     return kMF3DNoErr;
  358. }
  359.  
  360. /*==============================================================================
  361.  *    MF3D_ObjContainerDisposer
  362.  *==============================================================================
  363.  */
  364. MF3DErr
  365. MF3D_ObjContainerDisposer(
  366.     MF3DVoidObjPtr    inObj)
  367. {
  368.     MF3D_VerifyObjectType(inObj, kMF3DObjContainer);
  369.  
  370.     MF3D_Free(inObj);
  371.     return kMF3DNoErr;
  372. }
  373.  
  374. /*==============================================================================
  375.  *    MF3D_ObjEndContainerWriter
  376.  *==============================================================================
  377.  */
  378. MF3DErr
  379. MF3D_ObjEndContainerWriter(
  380.     MF3D_FilePtr    inMetafilePtr,
  381.     MF3DVoidObjPtr    inObj)
  382. {
  383.     MF3D_VerifyObjectType(inObj, kMF3DObjEndContainer);
  384.     MF3D_Unused(inMetafilePtr);
  385.     MF3D_Unused(inObj);
  386.     /* Nothing to write! */
  387.     return kMF3DNoErr;
  388. }
  389.  
  390. /*==============================================================================
  391.  *    MF3D_ObjEndContainerDisposer
  392.  *==============================================================================
  393.  */
  394. MF3DErr
  395. MF3D_ObjEndContainerDisposer(
  396.     MF3DVoidObjPtr    inObj)
  397. {
  398.     MF3D_VerifyObjectType(inObj, kMF3DObjEndContainer);
  399.  
  400.     MF3D_Free(inObj);
  401.     return kMF3DNoErr;
  402. }
  403.  
  404. /*==============================================================================
  405.  *    MF3D_ObjBeginGroupReader
  406.  *==============================================================================
  407.  */
  408. MF3DErr
  409. MF3D_ObjBeginGroupReader(
  410.     MF3D_FilePtr    inMetafilePtr,
  411.     MF3DVoidObjPtr    *outObj)
  412. {
  413.     MF3DBeginGroupObjPtr        returnObj;
  414.     MF3DErr                        result, dispResult;
  415.  
  416.     result = kMF3DNoErr;
  417.  
  418.     MF3D_Allocate(returnObj);
  419.  
  420.     if (result == kMF3DNoErr)
  421.     {    returnObj->group = NULL;
  422.         returnObj->displayState = NULL;
  423.         result = MF3D_IntReadObject(inMetafilePtr, &returnObj->group);
  424.     }
  425.  
  426.     /* Optional display state */
  427.     if (result == kMF3DNoErr)
  428.     {    dispResult = MF3D_IntReadObject(inMetafilePtr,
  429.                 (MF3DVoidObjPtr *)&returnObj->displayState);
  430.         if (dispResult == kMF3DNoErr &&
  431.                 returnObj->displayState->objectType !=
  432.                 kMF3DObjDisplayGroupState)
  433.         {    result = kMF3DErrWrongObjType;
  434.         }
  435.         if (dispResult != kMF3DErrCantParse)
  436.             result = dispResult;
  437.     }
  438.  
  439.     if (result == kMF3DNoErr)
  440.         result = MF3D_PushGroup(inMetafilePtr);
  441.  
  442.     if (result == kMF3DNoErr)
  443.         *outObj = (MF3DVoidObjPtr) returnObj;
  444.     else
  445.         MF3D_Free(returnObj);
  446.  
  447.     return result;
  448. }
  449.  
  450. /*==============================================================================
  451.  *    MF3D_ObjBeginGroupWriter
  452.  *==============================================================================
  453.  */
  454. MF3DErr
  455. MF3D_ObjBeginGroupWriter(
  456.     MF3D_FilePtr    inMetafilePtr,
  457.     MF3DVoidObjPtr    inObj)
  458. {
  459.     MF3DBeginGroupObjPtr    beginGroupObj;
  460.     MF3DErr                    result;
  461.  
  462.     MF3D_VerifyObjectType(inObj, kMF3DObjBeginGroup);
  463.     beginGroupObj = (MF3DBeginGroupObjPtr)inObj;
  464.  
  465.     if (beginGroupObj->group == NULL)
  466.         return kMF3DErrGroupTypeNotSpecified;
  467.  
  468.     MF3D_WriteNewLine(inMetafilePtr);
  469.     result = MF3DWriteAnObject(inMetafilePtr, beginGroupObj->group);
  470.  
  471.     if (result == kMF3DNoErr && beginGroupObj->displayState != NULL)
  472.     {    result = MF3DWriteAnObject(inMetafilePtr,
  473.                 (MF3DVoidObjPtr)beginGroupObj->displayState);
  474.     }
  475.  
  476.     return result;
  477. }
  478.  
  479. /*==============================================================================
  480.  *    MF3D_ObjBeginGroupDisposer
  481.  *==============================================================================
  482.  */
  483. MF3DErr
  484. MF3D_ObjBeginGroupDisposer(
  485.     MF3DVoidObjPtr    inObj)
  486. {
  487.     MF3D_VerifyObjectType(inObj, kMF3DObjBeginGroup);
  488.  
  489.     if (inObj != NULL)
  490.     {    MF3DDisposeObject(((MF3DBeginGroupObjPtr)inObj)->group);
  491.         MF3DDisposeObject((MF3DVoidObjPtr)
  492.                 ((MF3DBeginGroupObjPtr)inObj)->displayState);
  493.         MF3D_Free(inObj);
  494.     }
  495.     return kMF3DNoErr;
  496. }
  497.  
  498. /*==============================================================================
  499.  *    MF3D_ObjEndGroupReader
  500.  *==============================================================================
  501.  */
  502. MF3DErr
  503. MF3D_ObjEndGroupReader(
  504.     MF3D_FilePtr    inMetafilePtr,
  505.     MF3DVoidObjPtr    *outObj)
  506. {
  507.     MF3DEndGroupObjPtr            returnObj;
  508.     MF3DErr                        result;
  509.  
  510.     result = kMF3DNoErr;
  511.  
  512.     MF3D_Allocate(returnObj);
  513.  
  514.     if (result == kMF3DNoErr)
  515.     {    /* Do any necessary end group processing */
  516.         result = MF3D_PopGroup(inMetafilePtr);
  517.     }
  518.  
  519.     if (result == kMF3DNoErr)
  520.         *outObj = (MF3DVoidObjPtr) returnObj;
  521.     else
  522.         MF3D_Free(returnObj);
  523.  
  524.     return result;
  525. }
  526.  
  527. /*==============================================================================
  528.  *    MF3D_ObjEndGroupWriter
  529.  *==============================================================================
  530.  */
  531. MF3DErr
  532. MF3D_ObjEndGroupWriter(
  533.     MF3D_FilePtr    inMetafilePtr,
  534.     MF3DVoidObjPtr    inObj)
  535. {
  536.     MF3D_VerifyObjectType(inObj, kMF3DObjEndGroup);
  537.     MF3D_Unused(inMetafilePtr);
  538.     MF3D_Unused(inObj);
  539.     /* Nothing to write! */
  540.     return kMF3DNoErr;
  541. }
  542.  
  543. /*==============================================================================
  544.  *    MF3D_ObjEndGroupDisposer
  545.  *==============================================================================
  546.  */
  547. MF3DErr
  548. MF3D_ObjEndGroupDisposer(
  549.     MF3DVoidObjPtr    inObj)
  550. {
  551.     MF3D_VerifyObjectType(inObj, kMF3DObjEndGroup);
  552.  
  553.     MF3D_Free(inObj);
  554.     return kMF3DNoErr;
  555. }
  556.  
  557. /*==============================================================================
  558.  *    MF3D_ObjReferenceReader
  559.  *==============================================================================
  560.  */
  561. MF3DErr
  562. MF3D_ObjReferenceReader(
  563.     MF3D_FilePtr    inMetafilePtr,
  564.     MF3DVoidObjPtr    *outObj)
  565. {
  566.     MF3DReferenceObjPtr            returnObj;
  567.     MF3DErr                        result;
  568.  
  569.     result = kMF3DNoErr;
  570.  
  571.     MF3D_Allocate(returnObj);
  572.  
  573.     if (result == kMF3DNoErr)
  574.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->refID);
  575.  
  576.     if (result == kMF3DNoErr)
  577.         *outObj = (MF3DVoidObjPtr) returnObj;
  578.     else
  579.         MF3D_Free(returnObj);
  580.  
  581.     return result;
  582. }
  583.  
  584. /*==============================================================================
  585.  *    MF3D_ObjReferenceWriter
  586.  *==============================================================================
  587.  */
  588. MF3DErr
  589. MF3D_ObjReferenceWriter(
  590.     MF3D_FilePtr    inMetafilePtr,
  591.     MF3DVoidObjPtr    inObj)
  592. {
  593.     MF3D_VerifyObjectType(inObj, kMF3DObjReference);
  594.  
  595.     return MF3D_Uns32Write(inMetafilePtr, ((MF3DReferenceObjPtr)inObj)->refID);
  596. }
  597.  
  598. /*==============================================================================
  599.  *    MF3D_ObjReferenceDisposer
  600.  *==============================================================================
  601.  */
  602. MF3DErr
  603. MF3D_ObjReferenceDisposer(
  604.     MF3DVoidObjPtr    inObj)
  605. {
  606.     MF3D_VerifyObjectType(inObj, kMF3DObjReference);
  607.  
  608.     MF3D_Free(inObj);
  609.  
  610.     return kMF3DNoErr;
  611. }
  612.  
  613. /*==============================================================================
  614.  *    MF3D_ObjTableOfContentsReader
  615.  *==============================================================================
  616.  */
  617. MF3DErr
  618. MF3D_ObjTableOfContentsReader(
  619.     MF3D_FilePtr    inMetafilePtr,
  620.     MF3DVoidObjPtr    *outObj)
  621. {
  622.     MF3DTableOfContentsObjPtr    returnObj;
  623.     MF3DErr                        result;
  624.  
  625.     result = kMF3DNoErr;
  626.  
  627.     MF3D_Allocate(returnObj);
  628.  
  629.     if (result == kMF3DNoErr)
  630.         MF3D_Allocate(returnObj->nextTOC);
  631.  
  632.     if (result == kMF3DNoErr)
  633.         result = MF3D_RefRead(inMetafilePtr, returnObj->nextTOC);
  634.  
  635.     if (result == kMF3DNoErr)
  636.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->refSeed);
  637.  
  638.     if (result == kMF3DNoErr)
  639.         result = MF3D_Int32Read(inMetafilePtr, &returnObj->typeSeed);
  640.  
  641.     if (result == kMF3DNoErr)
  642.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->tocEntryType);
  643.  
  644.     if (result == kMF3DNoErr)
  645.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->tocEntrySize);
  646.  
  647.     if (result == kMF3DNoErr)
  648.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nEntries);
  649.  
  650.     if (result == kMF3DNoErr)
  651.     {    MF3DUns32    entriesLeft;
  652.  
  653.         entriesLeft = returnObj->nEntries;
  654.         if (entriesLeft == 0)
  655.         {    returnObj->tocEntries = NULL;
  656.         }
  657.         else
  658.         {    MF3D_TOCEntryPtr    curEntryPtr;
  659.  
  660.             returnObj->tocEntries = MF3D_Malloc(entriesLeft *
  661.                     sizeof(*returnObj->tocEntries));
  662.             if (returnObj->tocEntries == NULL)
  663.                 result = kMF3DErrOutOfMemory;
  664.  
  665.             curEntryPtr = returnObj->tocEntries;
  666.             while (result == kMF3DNoErr && entriesLeft > 0)
  667.             {    result = MF3D_Uns32Read(inMetafilePtr, &curEntryPtr->refID);
  668.  
  669.                 if (curEntryPtr->refID >= returnObj->refSeed)
  670.                     result = kMF3DErrIllegalRefID;
  671.  
  672.                 if (result == kMF3DNoErr)
  673.                     MF3D_Allocate(curEntryPtr->objLocation);
  674.  
  675.                 if (result == kMF3DNoErr)
  676.                 {    result = MF3D_RefRead(inMetafilePtr,
  677.                             curEntryPtr->objLocation);
  678.                 }
  679.  
  680.                 if (result == kMF3DNoErr)
  681.                 {    if (returnObj->tocEntryType >= 1)
  682.                     {    result = MF3D_ObjTypeRead(inMetafilePtr, NULL,
  683.                                 &curEntryPtr->objType);
  684.                     }
  685.                     else
  686.                     {    /* Not necessary, but looks better */
  687.                         curEntryPtr->objType = 0L;
  688.                     }
  689.                 }
  690.  
  691.                 --entriesLeft;
  692.                 ++curEntryPtr;
  693.             }
  694.  
  695.             if (result != kMF3DNoErr)
  696.             {    MF3D_Free(returnObj->tocEntries);
  697.             }
  698.         }
  699.     }
  700.  
  701.     if (result == kMF3DNoErr)
  702.         *outObj = (MF3DVoidObjPtr) returnObj;
  703.     else
  704.         MF3D_Free(returnObj);
  705.  
  706.     return result;
  707. }
  708.  
  709. /*==============================================================================
  710.  *    MF3D_ObjTableOfContentsWriter
  711.  *
  712.  *    Called only from MF3DClose when writing.
  713.  *==============================================================================
  714.  */
  715. MF3DErr
  716. MF3D_ObjTableOfContentsWriter(
  717.     MF3D_FilePtr    inMetafilePtr,
  718.     MF3DVoidObjPtr    inObj)
  719. {
  720.     MF3DUns32    entriesLeft;
  721.     MF3DErr        result;
  722.  
  723.     MF3D_Unused(inObj);
  724.  
  725.     result = kMF3DNoErr;
  726.  
  727.     MF3D_WriteNewLine(inMetafilePtr);
  728.  
  729.     /* NOTE: This will always write 0 in the binary case and
  730.      * nextTOC> in the text case. In the binary case, we will
  731.      * also trash inMetafilePtr->tocLocation, but we no longer
  732.      * need it because we have already backpatched the header.
  733.      * It also has the side effect of allocating a string that
  734.      * gets placed into inMetafilePtr->tocStuff.tocLabelName.
  735.      */
  736.     result = MF3D_TOCRefWrite(inMetafilePtr, NULL);
  737.  
  738.     MF3D_Free(inMetafilePtr->tocStuff.tocLabelName);
  739.     inMetafilePtr->tocStuff.tocLabelName = NULL;
  740.  
  741.     if (result == kMF3DNoErr)
  742.     {    MF3D_WriteNewLine(inMetafilePtr);
  743.         result = MF3D_Uns32Write(inMetafilePtr,
  744.                 inMetafilePtr->tocStuff.refSeed);
  745.     }
  746.  
  747.     if (result == kMF3DNoErr)
  748.         MF3D_CommentStrWrite(inMetafilePtr, "reference Seed");
  749.  
  750.     if (result == kMF3DNoErr)
  751.     {    result = MF3D_Int32Write(inMetafilePtr,
  752.                 inMetafilePtr->tocStuff.typeSeed);
  753.     }
  754.  
  755.     if (result == kMF3DNoErr)
  756.         MF3D_CommentStrWrite(inMetafilePtr, "type Seed");
  757.  
  758.     if (result == kMF3DNoErr)
  759.         result = MF3D_Uns32Write(inMetafilePtr, kMF3DTocEntryType);
  760.  
  761.     if (result == kMF3DNoErr)
  762.         result = MF3D_Uns32Write(inMetafilePtr, kMF3DTocEntrySize);
  763.  
  764.     if (result == kMF3DNoErr)
  765.         MF3D_CommentStrWrite(inMetafilePtr, "tocEntry type/size");
  766.  
  767.     if (result == kMF3DNoErr)
  768.     {    entriesLeft = inMetafilePtr->tocStuff.numReferences;
  769.         result = MF3D_Uns32Write(inMetafilePtr, entriesLeft);
  770.     }
  771.  
  772.     if (result == kMF3DNoErr)
  773.         MF3D_CommentStrWrite(inMetafilePtr, "nEntries");
  774.  
  775.     if (result == kMF3DNoErr)
  776.     {    MF3D_TOCReferencePtr    curRefPtr;
  777.  
  778.         curRefPtr = inMetafilePtr->tocStuff.references;
  779.         MFASSERT(curRefPtr != NULL || entriesLeft == 0);
  780.  
  781.         for ( ; result == kMF3DNoErr && entriesLeft > 0;
  782.                 --entriesLeft, ++curRefPtr)
  783.         {    MF3D_ObjStuffPtr    ignoredObjStuff;
  784.             MF3DVoidObj            fakeObj;
  785.  
  786.             result = MF3D_Uns32Write(inMetafilePtr, curRefPtr->refID);
  787.  
  788.             if (result == kMF3DNoErr)
  789.                 result = MF3D_RefWrite(inMetafilePtr, curRefPtr->ref);
  790.  
  791.             if (result == kMF3DNoErr)
  792.             {    /* Fake an object to write the type */
  793.                 MFASSERT((MF3DInt32)curRefPtr->type > 0);
  794.                 fakeObj.objectType = curRefPtr->type;
  795.                 result = MF3D_ObjTypeWrite(inMetafilePtr, &fakeObj,
  796.                         &ignoredObjStuff);
  797.             }
  798.  
  799.             if (result == kMF3DNoErr)
  800.                 MF3D_WriteNewLine(inMetafilePtr);
  801.         }
  802.     }
  803.  
  804.     return result;
  805. }
  806.  
  807. /*==============================================================================
  808.  *    MF3D_ObjTableOfContentsDisposer
  809.  *==============================================================================
  810.  */
  811. MF3DErr
  812. MF3D_ObjTableOfContentsDisposer(
  813.     MF3DVoidObjPtr    inObj)
  814. {
  815.     MF3DTableOfContentsObjPtr    tocObj;
  816.     MF3DErr                        result;
  817.  
  818.     MF3D_VerifyObjectType(inObj, kMF3DObjTableOfContents);
  819.  
  820.     result = kMF3DNoErr;
  821.  
  822.     tocObj = (MF3DTableOfContentsObjPtr) inObj;
  823.  
  824.     if (tocObj != NULL)
  825.     {    MF3DUns32    entriesLeft;
  826.  
  827.         result = MF3D_PositionReferenceDisposer(tocObj->nextTOC);
  828.  
  829.         if (result == kMF3DNoErr)
  830.         {    MF3D_TOCEntryPtr    curEntryPtr;
  831.  
  832.             curEntryPtr = tocObj->tocEntries;
  833.             for (entriesLeft = tocObj->nEntries; entriesLeft > 0; --entriesLeft)
  834.             {    MF3D_PositionReferenceDisposer(curEntryPtr->objLocation);
  835.                 MF3D_Free(curEntryPtr->objLocation);
  836.                 ++curEntryPtr;
  837.             }
  838.  
  839.             MF3D_Free(tocObj->nextTOC);
  840.             MF3D_Free(tocObj->tocEntries);
  841.             MF3D_Free(tocObj);
  842.         }
  843.     }
  844.  
  845.     return result;
  846. }
  847.  
  848. /*==============================================================================
  849.  *    MF3D_ObjTypeReader
  850.  *==============================================================================
  851.  */
  852. MF3DErr
  853. MF3D_ObjTypeReader(
  854.     MF3D_FilePtr    inMetafilePtr,
  855.     MF3DVoidObjPtr    *outObj)
  856. {
  857.     MF3DInt32            typeID;                /* always negative                */
  858.     MF3DCStringPtr        owner;                /* ISO 9070-registered ID        */
  859.     MF3DErr                result;
  860.  
  861.     result = MF3D_Int32Read(inMetafilePtr, &typeID);
  862.  
  863.     if (result == kMF3DNoErr && typeID >= 0)
  864.         result = kMF3DErrIllegalUserObjectType;
  865.  
  866.     if (result == kMF3DNoErr)
  867.         result = MF3D_CStringRead(inMetafilePtr, &owner);
  868.  
  869.     /* Make sure that the type number is not already taken */
  870.     if (result == kMF3DNoErr)
  871.     {    MF3DUns32            numTypes;
  872.         MF3D_TypeListPtr    typeListPtr;
  873.  
  874.         typeListPtr = inMetafilePtr->typeTable.types;
  875.         for (numTypes = inMetafilePtr->typeTable.nTypes;
  876.                 result == kMF3DNoErr && numTypes > 0;
  877.                 --numTypes, ++typeListPtr)
  878.         {    if (typeID == typeListPtr->number)
  879.                 result = kMF3DErrIllegalUserObjectType;
  880.         }
  881.     }
  882.  
  883.     /* Add it to our table */
  884.     if (result == kMF3DNoErr)
  885.     {    MF3D_TypeListPtr    tempPtr;
  886.         MF3DUns32            numTypes;
  887.  
  888.         ++inMetafilePtr->typeTable.nTypes;
  889.         numTypes = inMetafilePtr->typeTable.nTypes;
  890.  
  891.         tempPtr = MF3D_Realloc(inMetafilePtr->typeTable.types,
  892.                     numTypes * sizeof(*inMetafilePtr->typeTable.types));
  893.  
  894.         if (tempPtr == NULL)
  895.             result = kMF3DErrOutOfMemory;
  896.         else
  897.         {    inMetafilePtr->typeTable.types = tempPtr;
  898.             inMetafilePtr->typeTable.types[numTypes - 1].number = typeID;
  899.             inMetafilePtr->typeTable.types[numTypes - 1].name = owner;
  900.  
  901.             if (typeID < inMetafilePtr->tocStuff.typeSeed)
  902.                 inMetafilePtr->tocStuff.typeSeed = typeID - 1;
  903.         }
  904.     }
  905.  
  906.     /* Force reader to read again */
  907.     *outObj = NULL;
  908.  
  909.     return result;
  910. }
  911.  
  912. /*==============================================================================
  913.  *    MF3D_ObjTypeWriter
  914.  *
  915.  *    Supposed to be called only by MF3D_TypeObjWrite with inObj being of type
  916.  *    kMF3DObjUnknownType
  917.  *==============================================================================
  918.  */
  919. MF3DErr
  920. MF3D_ObjTypeWriter(
  921.     MF3D_FilePtr    inMetafilePtr,
  922.     MF3DVoidObjPtr    inObj)
  923. {
  924.     MF3DUnknownObjPtr    writeObj;
  925.     MF3DErr                result;
  926.  
  927.     MF3D_VerifyObjectType(inObj, kMF3DObjUnknownType);
  928.     writeObj = (MF3DUnknownObjPtr)inObj;
  929.  
  930.     MFASSERT(sizeof(writeObj->realObjectType) == sizeof(MF3DInt32));
  931.     result = MF3D_Int32Write(inMetafilePtr,
  932.             (MF3DInt32)writeObj->realObjectType);
  933.  
  934.     if (result == kMF3DNoErr)
  935.         result = MF3D_CStringWrite(inMetafilePtr, writeObj->realObjectName);
  936.  
  937.     return result;
  938. }
  939.  
  940. /*==============================================================================
  941.  *    MF3D_ObjTypeDisposer
  942.  *==============================================================================
  943.  */
  944. MF3DErr
  945. MF3D_ObjTypeDisposer(
  946.     MF3DVoidObjPtr    inObj)
  947. {
  948.     MF3D_VerifyObjectType(inObj, kMF3DObjType);
  949.     MF3D_Unused(inObj);
  950.     return kMF3DErrIllegalObjName;
  951. }
  952.  
  953. /*==============================================================================
  954.  *    MF3D_ObjFaceAttributeSetListReader
  955.  *==============================================================================
  956.  */
  957. MF3DErr
  958. MF3D_ObjFaceAttributeSetListReader(
  959.     MF3D_FilePtr    inMetafilePtr,
  960.     MF3DVoidObjPtr    *outObj)
  961. {
  962.     MF3DFaceAttributeSetListObjPtr    returnObj;
  963.     MF3DUns32                        nObjects;
  964.     MF3DUns32                        nIndices;
  965.     MF3DErr                            result;
  966.  
  967.     result = kMF3DNoErr;
  968.  
  969.     MF3D_Allocate(returnObj);
  970.  
  971.     if (result == kMF3DNoErr)
  972.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nObjects);
  973.  
  974.     if (result == kMF3DNoErr)
  975.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_PackingEnum,
  976.                 &returnObj->packing);
  977.     }
  978.  
  979.     if (result == kMF3DNoErr)
  980.     {    result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nIndices);
  981.         nObjects = returnObj->nObjects;
  982.         nIndices = returnObj->nIndices;
  983.     }
  984.  
  985.     if (result == kMF3DNoErr && nIndices < 0)
  986.         result = kMF3DErrNIndicesLessThanZero;
  987.  
  988.     if (result == kMF3DNoErr && nIndices > nObjects)    /* F7K_PAM */
  989.         result = kMF3DErrNIndicesGreaterThanNObjects;
  990.  
  991.     if (result == kMF3DNoErr)
  992.     {    MF3DUns32        indicesToRead;
  993.         MF3DUns32Ptr    curIndexPtr;
  994.  
  995.         returnObj->indices = MF3D_Malloc(nIndices *
  996.                 sizeof(*returnObj->indices));
  997.         if (returnObj->indices == NULL)
  998.             result = kMF3DErrOutOfMemory;
  999.  
  1000.         indicesToRead = nIndices;
  1001.         curIndexPtr = returnObj->indices;
  1002.         while (result == kMF3DNoErr && indicesToRead > 0)
  1003.         {    result = MF3D_VariableUnsRead(inMetafilePtr, nObjects, curIndexPtr);
  1004.             --indicesToRead;
  1005.             ++curIndexPtr;
  1006.         }
  1007.  
  1008.         if (result != kMF3DNoErr)
  1009.         {    MF3D_Free(returnObj->indices);
  1010.         }
  1011.     }
  1012.  
  1013.     if (result == kMF3DNoErr)
  1014.         *outObj = (MF3DVoidObjPtr) returnObj;
  1015.     else
  1016.         MF3D_Free(returnObj);
  1017.  
  1018.     return result;
  1019. }
  1020.  
  1021.  
  1022. /*==============================================================================
  1023.  *    MF3D_ObjFaceAttributeSetListWriter
  1024.  *==============================================================================
  1025.  */
  1026. MF3DErr
  1027. MF3D_ObjFaceAttributeSetListWriter(
  1028.     MF3D_FilePtr    inMetafilePtr,
  1029.     MF3DVoidObjPtr    inObj)
  1030. {
  1031.     MF3DFaceAttributeSetListObjPtr    writeObj;
  1032.     MF3DUns32                        nObjects;
  1033.     MF3DUns32                        nIndices;
  1034.     MF3DErr                            result;
  1035.  
  1036.     MF3D_VerifyObjectType(inObj, kMF3DObjFaceAttributeSetList);
  1037.     writeObj = (MF3DFaceAttributeSetListObjPtr)inObj;
  1038.  
  1039.     nObjects = writeObj->nObjects;
  1040.     nIndices = writeObj->nIndices;
  1041.  
  1042.     MF3D_WriteNewLine(inMetafilePtr);
  1043.     result = MF3D_Uns32Write(inMetafilePtr, nObjects);
  1044.  
  1045.     if (result == kMF3DNoErr)
  1046.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_PackingEnum,
  1047.                 writeObj->packing);
  1048.     }
  1049.  
  1050.     if (result == kMF3DNoErr && nIndices < 0)
  1051.         result = kMF3DErrNIndicesLessThanZero;
  1052.  
  1053.     if (result == kMF3DNoErr && nIndices > nObjects)    /* F7K_PAM */ 
  1054.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1055.  
  1056.     if (result == kMF3DNoErr)
  1057.         result = MF3D_Uns32Write(inMetafilePtr, nIndices);
  1058.  
  1059.     if (result == kMF3DNoErr)
  1060.     {    MF3DUns32Ptr    curIndexPtr;
  1061.  
  1062.         if (nIndices > 0)
  1063.             MF3D_WriteNewLine(inMetafilePtr);
  1064.         curIndexPtr = writeObj->indices;
  1065.         for ( ; result == kMF3DNoErr && nIndices > 0; --nIndices)
  1066.         {    result = MF3D_VariableUnsWrite(inMetafilePtr, nObjects,
  1067.                     *curIndexPtr++);
  1068.         }
  1069.         MF3D_WriteNewLine(inMetafilePtr);
  1070.     }
  1071.  
  1072.     return result;
  1073. }
  1074.  
  1075. /*==============================================================================
  1076.  *    MF3D_ObjFaceAttributeSetListDisposer
  1077.  *==============================================================================
  1078.  */
  1079. MF3DErr
  1080. MF3D_ObjFaceAttributeSetListDisposer(
  1081.     MF3DVoidObjPtr    inObj)
  1082. {
  1083.     MF3D_VerifyObjectType(inObj, kMF3DObjFaceAttributeSetList);
  1084.  
  1085.     if (inObj != NULL)
  1086.     {    MF3D_Free(((MF3DFaceAttributeSetListObjPtr)inObj)->indices);
  1087.         MF3D_Free(inObj);
  1088.     }
  1089.     return kMF3DNoErr;
  1090. }
  1091.  
  1092. /*==============================================================================
  1093.  *    MF3D_ObjGeometryAttributeSetListReader
  1094.  *==============================================================================
  1095.  */
  1096. MF3DErr
  1097. MF3D_ObjGeometryAttributeSetListReader(
  1098.     MF3D_FilePtr    inMetafilePtr,
  1099.     MF3DVoidObjPtr    *outObj)
  1100. {
  1101.     MF3DGeometryAttributeSetListObjPtr    returnObj;
  1102.     MF3DUns32                            nObjects;
  1103.     MF3DUns32                            nIndices;
  1104.     MF3DErr                                result;
  1105.  
  1106.     result = kMF3DNoErr;
  1107.  
  1108.     MF3D_Allocate(returnObj);
  1109.  
  1110.     if (result == kMF3DNoErr)
  1111.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nObjects);
  1112.  
  1113.     if (result == kMF3DNoErr)
  1114.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_PackingEnum,
  1115.                 &returnObj->packing);
  1116.     }
  1117.  
  1118.     if (result == kMF3DNoErr)
  1119.     {    result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nIndices);
  1120.         nObjects = returnObj->nObjects;
  1121.         nIndices = returnObj->nIndices;
  1122.     }
  1123.  
  1124.     if (result == kMF3DNoErr && nIndices < 0)
  1125.         result = kMF3DErrNIndicesLessThanZero;
  1126.  
  1127.     if (result == kMF3DNoErr && nIndices > nObjects)    /* F7K_PAM */ 
  1128.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1129.  
  1130.     if (result == kMF3DNoErr)
  1131.     {    MF3DUns32        indicesToRead;
  1132.         MF3DUns32Ptr    curIndexPtr;
  1133.  
  1134.         returnObj->indices = MF3D_Malloc(nIndices *
  1135.                 sizeof(*returnObj->indices));
  1136.         if (returnObj->indices == NULL)
  1137.             result = kMF3DErrOutOfMemory;
  1138.  
  1139.         indicesToRead = nIndices;
  1140.         curIndexPtr = returnObj->indices;
  1141.         while (result == kMF3DNoErr && indicesToRead > 0)
  1142.         {    result = MF3D_VariableUnsRead(inMetafilePtr, nObjects, curIndexPtr);
  1143.             --indicesToRead;
  1144.             ++curIndexPtr;
  1145.         }
  1146.  
  1147.         if (result != kMF3DNoErr)
  1148.         {    MF3D_Free(returnObj->indices);
  1149.         }
  1150.     }
  1151.  
  1152.     if (result == kMF3DNoErr)
  1153.         *outObj = (MF3DVoidObjPtr) returnObj;
  1154.     else
  1155.         MF3D_Free(returnObj);
  1156.  
  1157.     return result;
  1158. }
  1159.  
  1160.  
  1161. /*==============================================================================
  1162.  *    MF3D_ObjGeometryAttributeSetListWriter
  1163.  *==============================================================================
  1164.  */
  1165. MF3DErr
  1166. MF3D_ObjGeometryAttributeSetListWriter(
  1167.     MF3D_FilePtr    inMetafilePtr,
  1168.     MF3DVoidObjPtr    inObj)
  1169. {
  1170.     MF3DGeometryAttributeSetListObjPtr    writeObj;
  1171.     MF3DUns32                            nObjects;
  1172.     MF3DUns32                            nIndices;
  1173.     MF3DErr                                result;
  1174.  
  1175.     MF3D_VerifyObjectType(inObj, kMF3DObjGeometryAttributeSetList);
  1176.     writeObj = (MF3DGeometryAttributeSetListObjPtr)inObj;
  1177.  
  1178.     nObjects = writeObj->nObjects;
  1179.     nIndices = writeObj->nIndices;
  1180.  
  1181.     MF3D_WriteNewLine(inMetafilePtr);
  1182.     result = MF3D_Uns32Write(inMetafilePtr, nObjects);
  1183.  
  1184.     if (result == kMF3DNoErr)
  1185.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_PackingEnum,
  1186.                 writeObj->packing);
  1187.     }
  1188.  
  1189.     nIndices = writeObj->nIndices;
  1190.     if (result == kMF3DNoErr && nIndices < 0)
  1191.         result = kMF3DErrNIndicesLessThanZero;
  1192.  
  1193.     if (result == kMF3DNoErr && nIndices > nObjects)     /* F7K_PAM */ 
  1194.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1195.  
  1196.     if (result == kMF3DNoErr)
  1197.         result = MF3D_Uns32Write(inMetafilePtr, nIndices);
  1198.  
  1199.     if (result == kMF3DNoErr)
  1200.     {    MF3DUns32Ptr    curIndexPtr;
  1201.  
  1202.         if (nIndices > 0)
  1203.             MF3D_WriteNewLine(inMetafilePtr);
  1204.         curIndexPtr = writeObj->indices;
  1205.         for ( ; result == kMF3DNoErr && nIndices > 0; --nIndices)
  1206.         {    result = MF3D_VariableUnsWrite(inMetafilePtr, nObjects,
  1207.                     *curIndexPtr++);
  1208.         }
  1209.         MF3D_WriteNewLine(inMetafilePtr);
  1210.     }
  1211.  
  1212.     return result;
  1213. }
  1214.  
  1215. /*==============================================================================
  1216.  *    MF3D_ObjGeometryAttributeSetListDisposer
  1217.  *==============================================================================
  1218.  */
  1219. MF3DErr
  1220. MF3D_ObjGeometryAttributeSetListDisposer(
  1221.     MF3DVoidObjPtr    inObj)
  1222. {
  1223.     MF3D_VerifyObjectType(inObj, kMF3DObjGeometryAttributeSetList);
  1224.  
  1225.     if (inObj != NULL)
  1226.     {    MF3D_Free(((MF3DGeometryAttributeSetListObjPtr)inObj)->indices);
  1227.         MF3D_Free(inObj);
  1228.     }
  1229.     return kMF3DNoErr;
  1230. }
  1231.  
  1232. /*==============================================================================
  1233.  *    MF3D_ObjVertexAttributeSetListReader
  1234.  *==============================================================================
  1235.  */
  1236. MF3DErr
  1237. MF3D_ObjVertexAttributeSetListReader(
  1238.     MF3D_FilePtr    inMetafilePtr,
  1239.     MF3DVoidObjPtr    *outObj)
  1240. {
  1241.     MF3DVertexAttributeSetListObjPtr    returnObj;
  1242.     MF3DUns32                            nObjects;
  1243.     MF3DUns32                            nIndices;
  1244.     MF3DErr                                result;
  1245.  
  1246.     result = kMF3DNoErr;
  1247.  
  1248.     MF3D_Allocate(returnObj);
  1249.  
  1250.     if (result == kMF3DNoErr)
  1251.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nObjects);
  1252.  
  1253.     if (result == kMF3DNoErr)
  1254.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_PackingEnum,
  1255.                 &returnObj->packing);
  1256.     }
  1257.  
  1258.     if (result == kMF3DNoErr)
  1259.     {    result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nIndices);
  1260.         nObjects = returnObj->nObjects;
  1261.         nIndices = returnObj->nIndices;
  1262.     }
  1263.  
  1264.     if (result == kMF3DNoErr && nIndices < 0)
  1265.         result = kMF3DErrNIndicesLessThanZero;
  1266.  
  1267.     if (result == kMF3DNoErr && nIndices > nObjects)    /* F7K_PAM */ 
  1268.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1269.  
  1270.     if (result == kMF3DNoErr)
  1271.     {    MF3DUns32        indicesToRead;
  1272.         MF3DUns32Ptr    curIndexPtr;
  1273.  
  1274.         returnObj->indices = MF3D_Malloc(nIndices *
  1275.                 sizeof(*returnObj->indices));
  1276.         if (returnObj->indices == NULL)
  1277.             result = kMF3DErrOutOfMemory;
  1278.  
  1279.         indicesToRead = nIndices;
  1280.         curIndexPtr = returnObj->indices;
  1281.         while (result == kMF3DNoErr && indicesToRead > 0)
  1282.         {    result = MF3D_VariableUnsRead(inMetafilePtr, nObjects, curIndexPtr);
  1283.             --indicesToRead;
  1284.             ++curIndexPtr;
  1285.         }
  1286.  
  1287.         if (result != kMF3DNoErr)
  1288.         {    MF3D_Free(returnObj->indices);
  1289.         }
  1290.     }
  1291.  
  1292.     if (result == kMF3DNoErr)
  1293.         *outObj = (MF3DVoidObjPtr) returnObj;
  1294.     else
  1295.         MF3D_Free(returnObj);
  1296.  
  1297.     return result;
  1298. }
  1299.  
  1300.  
  1301. /*==============================================================================
  1302.  *    MF3D_ObjVertexAttributeSetListWriter
  1303.  *==============================================================================
  1304.  */
  1305. MF3DErr
  1306. MF3D_ObjVertexAttributeSetListWriter(
  1307.     MF3D_FilePtr    inMetafilePtr,
  1308.     MF3DVoidObjPtr    inObj)
  1309. {
  1310.     MF3DVertexAttributeSetListObjPtr    writeObj;
  1311.     MF3DUns32                            nObjects;
  1312.     MF3DUns32                            nIndices;
  1313.     MF3DErr                                result;
  1314.  
  1315.     MF3D_VerifyObjectType(inObj, kMF3DObjVertexAttributeSetList);
  1316.     writeObj = (MF3DVertexAttributeSetListObjPtr)inObj;
  1317.  
  1318.     nObjects = writeObj->nObjects;
  1319.     nIndices = writeObj->nIndices;
  1320.  
  1321.     MF3D_WriteNewLine(inMetafilePtr);
  1322.     result = MF3D_Uns32Write(inMetafilePtr, nObjects);
  1323.  
  1324.     if (result == kMF3DNoErr)
  1325.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_PackingEnum,
  1326.                 writeObj->packing);
  1327.     }
  1328.  
  1329.     nIndices = writeObj->nIndices;
  1330.     if (result == kMF3DNoErr && nIndices < 0)
  1331.         result = kMF3DErrNIndicesLessThanZero;
  1332.  
  1333.     if (result == kMF3DNoErr && nIndices > nObjects)    /* F7K_PAM */ 
  1334.         result = kMF3DErrNIndicesGreaterThanNObjects;
  1335.  
  1336.     if (result == kMF3DNoErr)
  1337.         result = MF3D_Uns32Write(inMetafilePtr, nIndices);
  1338.  
  1339.     if (result == kMF3DNoErr)
  1340.     {    MF3DUns32Ptr    curIndexPtr;
  1341.  
  1342.         if (nIndices > 0)
  1343.             MF3D_WriteNewLine(inMetafilePtr);
  1344.         curIndexPtr = writeObj->indices;
  1345.         for ( ; result == kMF3DNoErr && nIndices > 0; --nIndices)
  1346.         {    result = MF3D_VariableUnsWrite(inMetafilePtr, nObjects,
  1347.                     *curIndexPtr++);
  1348.         }
  1349.         MF3D_WriteNewLine(inMetafilePtr);
  1350.     }
  1351.  
  1352.     return result;
  1353. }
  1354.  
  1355. /*==============================================================================
  1356.  *    MF3D_ObjVertexAttributeSetListDisposer
  1357.  *==============================================================================
  1358.  */
  1359. MF3DErr
  1360. MF3D_ObjVertexAttributeSetListDisposer(
  1361.     MF3DVoidObjPtr    inObj)
  1362. {
  1363.     MF3D_VerifyObjectType(inObj, kMF3DObjVertexAttributeSetList);
  1364.  
  1365.     if (inObj != NULL)
  1366.     {    MF3D_Free(((MF3DVertexAttributeSetListObjPtr)inObj)->indices);
  1367.         MF3D_Free(inObj);
  1368.     }
  1369.     return kMF3DNoErr;
  1370. }
  1371.  
  1372. /*==============================================================================
  1373.  *    MF3D_ObjCameraPlacementReader
  1374.  *==============================================================================
  1375.  */
  1376. MF3DErr
  1377. MF3D_ObjCameraPlacementReader(
  1378.     MF3D_FilePtr    inMetafilePtr,
  1379.     MF3DVoidObjPtr    *outObj)
  1380. {
  1381.     MF3DCameraPlacementObjPtr    returnObj;
  1382.     MF3DErr                        result;
  1383.  
  1384.     result = kMF3DNoErr;
  1385.  
  1386.     MF3D_Allocate(returnObj);
  1387.  
  1388.     if (result == kMF3DNoErr)
  1389.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->location);
  1390.  
  1391.     if (result == kMF3DNoErr)
  1392.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->pointOfInterest);
  1393.  
  1394.     if (result == kMF3DNoErr)
  1395.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->upVector);
  1396.  
  1397.     if (result == kMF3DNoErr)
  1398.         *outObj = (MF3DVoidObjPtr) returnObj;
  1399.     else
  1400.         MF3D_Free(returnObj);
  1401.  
  1402.     return result;
  1403. }
  1404.  
  1405. /*==============================================================================
  1406.  *    MF3D_ObjCameraPlacementWriter
  1407.  *==============================================================================
  1408.  */
  1409. MF3DErr
  1410. MF3D_ObjCameraPlacementWriter(
  1411.     MF3D_FilePtr    inMetafilePtr,
  1412.     MF3DVoidObjPtr    inObj)
  1413. {
  1414.     MF3DCameraPlacementObjPtr    writeObj;
  1415.     MF3DErr                        result;
  1416.  
  1417.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraPlacement);
  1418.  
  1419.     writeObj = (MF3DCameraPlacementObjPtr)inObj;
  1420.  
  1421.     MF3D_WriteNewLine(inMetafilePtr);
  1422.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->location);
  1423.  
  1424.     if (result == kMF3DNoErr)
  1425.     {    MF3D_WriteNewLine(inMetafilePtr);
  1426.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->pointOfInterest);
  1427.     }
  1428.  
  1429.     if (result == kMF3DNoErr)
  1430.     {    MF3D_WriteNewLine(inMetafilePtr);
  1431.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->upVector);
  1432.     }
  1433.  
  1434.     if (result == kMF3DNoErr)
  1435.         MF3D_WriteNewLine(inMetafilePtr);
  1436.  
  1437.     return result;
  1438. }
  1439.  
  1440. /*==============================================================================
  1441.  *    MF3D_ObjCameraPlacementDisposer
  1442.  *==============================================================================
  1443.  */
  1444. MF3DErr
  1445. MF3D_ObjCameraPlacementDisposer(
  1446.     MF3DVoidObjPtr    inObj)
  1447. {
  1448.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraPlacement);
  1449.  
  1450.     MF3D_Free(inObj);
  1451.     return kMF3DNoErr;
  1452. }
  1453.  
  1454. /*==============================================================================
  1455.  *    MF3D_ObjCameraRangeReader
  1456.  *==============================================================================
  1457.  */
  1458. MF3DErr
  1459. MF3D_ObjCameraRangeReader(
  1460.     MF3D_FilePtr    inMetafilePtr,
  1461.     MF3DVoidObjPtr    *outObj)
  1462. {
  1463.     MF3DCameraRangeObjPtr        returnObj;
  1464.     MF3DErr                        result;
  1465.  
  1466.     result = kMF3DNoErr;
  1467.  
  1468.     MF3D_Allocate(returnObj);
  1469.  
  1470.     if (result == kMF3DNoErr)
  1471.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->hither);
  1472.  
  1473.     if (result == kMF3DNoErr)
  1474.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->yon);
  1475.  
  1476.     if (result == kMF3DNoErr)
  1477.         *outObj = (MF3DVoidObjPtr) returnObj;
  1478.     else
  1479.         MF3D_Free(returnObj);
  1480.  
  1481.     return result;
  1482. }
  1483.  
  1484. /*==============================================================================
  1485.  *    MF3D_ObjCameraRangeWriter
  1486.  *==============================================================================
  1487.  */
  1488. MF3DErr
  1489. MF3D_ObjCameraRangeWriter(
  1490.     MF3D_FilePtr    inMetafilePtr,
  1491.     MF3DVoidObjPtr    inObj)
  1492. {
  1493.     MF3DCameraRangeObjPtr        writeObj;
  1494.     MF3DErr                        result;
  1495.  
  1496.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraRange);
  1497.     writeObj = (MF3DCameraRangeObjPtr)inObj;
  1498.  
  1499.     result = MF3D_Float32Write(inMetafilePtr, writeObj->hither);
  1500.  
  1501.     if (result == kMF3DNoErr)
  1502.         result = MF3D_Float32Write(inMetafilePtr, writeObj->yon);
  1503.  
  1504.     return result;
  1505. }
  1506.  
  1507. /*==============================================================================
  1508.  *    MF3D_ObjCameraRangeDisposer
  1509.  *==============================================================================
  1510.  */
  1511. MF3DErr
  1512. MF3D_ObjCameraRangeDisposer(
  1513.     MF3DVoidObjPtr    inObj)
  1514. {
  1515.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraRange);
  1516.  
  1517.     MF3D_Free(inObj);
  1518.     return kMF3DNoErr;
  1519. }
  1520.  
  1521. /*==============================================================================
  1522.  *    MF3D_ObjCameraViewPortReader
  1523.  *==============================================================================
  1524.  */
  1525. MF3DErr
  1526. MF3D_ObjCameraViewPortReader(
  1527.     MF3D_FilePtr    inMetafilePtr,
  1528.     MF3DVoidObjPtr    *outObj)
  1529. {
  1530.     MF3DCameraViewPortObjPtr    returnObj;
  1531.     MF3DErr                        result;
  1532.  
  1533.     result = kMF3DNoErr;
  1534.  
  1535.     MF3D_Allocate(returnObj);
  1536.  
  1537.     if (result == kMF3DNoErr)
  1538.         result = MF3D_Point2DRead(inMetafilePtr, &returnObj->origin);
  1539.  
  1540.     if (result == kMF3DNoErr)
  1541.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->width);
  1542.  
  1543.     if (result == kMF3DNoErr)
  1544.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->height);
  1545.  
  1546.     if (result == kMF3DNoErr)
  1547.         *outObj = (MF3DVoidObjPtr) returnObj;
  1548.     else
  1549.         MF3D_Free(returnObj);
  1550.  
  1551.     return result;
  1552. }
  1553.  
  1554. /*==============================================================================
  1555.  *    MF3D_ObjCameraViewPortWriter
  1556.  *==============================================================================
  1557.  */
  1558. MF3DErr
  1559. MF3D_ObjCameraViewPortWriter(
  1560.     MF3D_FilePtr    inMetafilePtr,
  1561.     MF3DVoidObjPtr    inObj)
  1562. {
  1563.     MF3DCameraViewPortObjPtr    writeObj;
  1564.     MF3DErr                        result;
  1565.  
  1566.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraViewPort);
  1567.     writeObj = (MF3DCameraViewPortObjPtr)inObj;
  1568.  
  1569.     result = MF3D_Point2DWrite(inMetafilePtr, writeObj->origin);
  1570.  
  1571.     if (result == kMF3DNoErr)
  1572.         result = MF3D_Float32Write(inMetafilePtr, writeObj->width);
  1573.  
  1574.     if (result == kMF3DNoErr)
  1575.         result = MF3D_Float32Write(inMetafilePtr, writeObj->height);
  1576.  
  1577.     return result;
  1578. }
  1579.  
  1580. /*==============================================================================
  1581.  *    MF3D_ObjCameraViewPortDisposer
  1582.  *==============================================================================
  1583.  */
  1584. MF3DErr
  1585. MF3D_ObjCameraViewPortDisposer(
  1586.     MF3DVoidObjPtr    inObj)
  1587. {
  1588.     MF3D_VerifyObjectType(inObj, kMF3DObjCameraViewPort);
  1589.  
  1590.     MF3D_Free(inObj);
  1591.     return kMF3DNoErr;
  1592. }
  1593.  
  1594. /*==============================================================================
  1595.  *    MF3D_ObjBottomCapAttributeSetReader
  1596.  *==============================================================================
  1597.  */
  1598. MF3DErr
  1599. MF3D_ObjBottomCapAttributeSetReader(
  1600.     MF3D_FilePtr    inMetafilePtr,
  1601.     MF3DVoidObjPtr    *outObj)
  1602. {
  1603.     MF3DBottomCapAttributeSetObjPtr    returnObj;
  1604.     MF3DErr                            result;
  1605.  
  1606.     MF3D_Unused(inMetafilePtr);
  1607.     result = kMF3DNoErr;
  1608.  
  1609.     MF3D_Allocate(returnObj);
  1610.  
  1611.     if (result == kMF3DNoErr)
  1612.         *outObj = (MF3DVoidObjPtr) returnObj;
  1613.     else
  1614.         MF3D_Free(returnObj);
  1615.  
  1616.     return result;
  1617. }
  1618.  
  1619. /*==============================================================================
  1620.  *    MF3D_ObjBottomCapAttributeSetWriter
  1621.  *==============================================================================
  1622.  */
  1623. MF3DErr
  1624. MF3D_ObjBottomCapAttributeSetWriter(
  1625.     MF3D_FilePtr    inMetafilePtr,
  1626.     MF3DVoidObjPtr    inObj)
  1627. {
  1628.     MF3D_VerifyObjectType(inObj, kMF3DObjBottomCapAttributeSet);
  1629.     MF3D_Unused(inMetafilePtr);
  1630.     MF3D_Unused(inObj);
  1631.     /* Nothing to write! */
  1632.     return kMF3DNoErr;
  1633. }
  1634.  
  1635. /*==============================================================================
  1636.  *    MF3D_ObjBottomCapAttributeSetDisposer
  1637.  *==============================================================================
  1638.  */
  1639. MF3DErr
  1640. MF3D_ObjBottomCapAttributeSetDisposer(
  1641.     MF3DVoidObjPtr    inObj)
  1642. {
  1643.     MF3D_VerifyObjectType(inObj, kMF3DObjBottomCapAttributeSet);
  1644.  
  1645.     MF3D_Free(inObj);
  1646.     return kMF3DNoErr;
  1647. }
  1648.  
  1649. /*==============================================================================
  1650.  *    MF3D_ObjCapsReader
  1651.  *==============================================================================
  1652.  */
  1653. MF3DErr
  1654. MF3D_ObjCapsReader(
  1655.     MF3D_FilePtr    inMetafilePtr,
  1656.     MF3DVoidObjPtr    *outObj)
  1657. {
  1658.     MF3DCapsObjPtr                returnObj;
  1659.     MF3DErr                        result;
  1660.  
  1661.     result = kMF3DNoErr;
  1662.  
  1663.     MF3D_Allocate(returnObj);
  1664.  
  1665.     if (result == kMF3DNoErr)
  1666.     {    result = MF3D_FlagsRead(inMetafilePtr, gMF3D_CapsFlags,
  1667.                 &returnObj->caps);
  1668.     }
  1669.  
  1670.     if (result == kMF3DNoErr)
  1671.         *outObj = (MF3DVoidObjPtr) returnObj;
  1672.     else
  1673.         MF3D_Free(returnObj);
  1674.  
  1675.     return result;
  1676. }
  1677.  
  1678. /*==============================================================================
  1679.  *    MF3D_ObjCapsWriter
  1680.  *==============================================================================
  1681.  */
  1682. MF3DErr
  1683. MF3D_ObjCapsWriter(
  1684.     MF3D_FilePtr    inMetafilePtr,
  1685.     MF3DVoidObjPtr    inObj)
  1686. {
  1687.     MF3D_VerifyObjectType(inObj, kMF3DObjCaps);
  1688.     return MF3D_FlagsWrite(inMetafilePtr, gMF3D_CapsFlags,
  1689.                 ((MF3DCapsObjPtr)inObj)->caps);
  1690. }
  1691.  
  1692. /*==============================================================================
  1693.  *    MF3D_ObjCapsDisposer
  1694.  *==============================================================================
  1695.  */
  1696. MF3DErr
  1697. MF3D_ObjCapsDisposer(
  1698.     MF3DVoidObjPtr    inObj)
  1699. {
  1700.     MF3D_VerifyObjectType(inObj, kMF3DObjCaps);
  1701.  
  1702.     MF3D_Free(inObj);
  1703.     return kMF3DNoErr;
  1704. }
  1705.  
  1706. /*==============================================================================
  1707.  *    MF3D_ObjFaceCapAttributeSetReader
  1708.  *==============================================================================
  1709.  */
  1710. MF3DErr
  1711. MF3D_ObjFaceCapAttributeSetReader(
  1712.     MF3D_FilePtr    inMetafilePtr,
  1713.     MF3DVoidObjPtr    *outObj)
  1714. {
  1715.     MF3DFaceCapAttributeSetObjPtr    returnObj;
  1716.     MF3DErr                        result;
  1717.  
  1718.     MF3D_Unused(inMetafilePtr);
  1719.     result = kMF3DNoErr;
  1720.  
  1721.     MF3D_Allocate(returnObj);
  1722.  
  1723.     if (result == kMF3DNoErr)
  1724.         *outObj = (MF3DVoidObjPtr) returnObj;
  1725.     else
  1726.         MF3D_Free(returnObj);
  1727.  
  1728.     return result;
  1729. }
  1730.  
  1731. /*==============================================================================
  1732.  *    MF3D_ObjFaceCapAttributeSetWriter
  1733.  *==============================================================================
  1734.  */
  1735. MF3DErr
  1736. MF3D_ObjFaceCapAttributeSetWriter(
  1737.     MF3D_FilePtr    inMetafilePtr,
  1738.     MF3DVoidObjPtr    inObj)
  1739. {
  1740.     MF3D_VerifyObjectType(inObj, kMF3DObjFaceCapAttributeSet);
  1741.     MF3D_Unused(inMetafilePtr);
  1742.     MF3D_Unused(inObj);
  1743.     /* Nothing to write! */
  1744.     return kMF3DNoErr;
  1745. }
  1746.  
  1747. /*==============================================================================
  1748.  *    MF3D_ObjFaceCapAttributeSetDisposer
  1749.  *==============================================================================
  1750.  */
  1751. MF3DErr
  1752. MF3D_ObjFaceCapAttributeSetDisposer(
  1753.     MF3DVoidObjPtr    inObj)
  1754. {
  1755.     MF3D_VerifyObjectType(inObj, kMF3DObjFaceCapAttributeSet);
  1756.  
  1757.     MF3D_Free(inObj);
  1758.     return kMF3DNoErr;
  1759. }
  1760.  
  1761. /*==============================================================================
  1762.  *    MF3D_ObjTopCapAttributeSetReader
  1763.  *==============================================================================
  1764.  */
  1765. MF3DErr
  1766. MF3D_ObjTopCapAttributeSetReader(
  1767.     MF3D_FilePtr    inMetafilePtr,
  1768.     MF3DVoidObjPtr    *outObj)
  1769. {
  1770.     MF3DTopCapAttributeSetObjPtr    returnObj;
  1771.     MF3DErr                        result;
  1772.  
  1773.     MF3D_Unused(inMetafilePtr);
  1774.     result = kMF3DNoErr;
  1775.  
  1776.     MF3D_Allocate(returnObj);
  1777.  
  1778.     if (result == kMF3DNoErr)
  1779.         *outObj = (MF3DVoidObjPtr) returnObj;
  1780.     else
  1781.         MF3D_Free(returnObj);
  1782.  
  1783.     return result;
  1784. }
  1785.  
  1786. /*==============================================================================
  1787.  *    MF3D_ObjTopCapAttributeSetWriter
  1788.  *==============================================================================
  1789.  */
  1790. MF3DErr
  1791. MF3D_ObjTopCapAttributeSetWriter(
  1792.     MF3D_FilePtr    inMetafilePtr,
  1793.     MF3DVoidObjPtr    inObj)
  1794. {
  1795.     MF3D_VerifyObjectType(inObj, kMF3DObjTopCapAttributeSet);
  1796.     MF3D_Unused(inMetafilePtr);
  1797.     MF3D_Unused(inObj);
  1798.     /* Nothing to write! */
  1799.     return kMF3DNoErr;
  1800. }
  1801.  
  1802. /*==============================================================================
  1803.  *    MF3D_ObjTopCapAttributeSetDisposer
  1804.  *==============================================================================
  1805.  */
  1806. MF3DErr
  1807. MF3D_ObjTopCapAttributeSetDisposer(
  1808.     MF3DVoidObjPtr    inObj)
  1809. {
  1810.     MF3D_VerifyObjectType(inObj, kMF3DObjTopCapAttributeSet);
  1811.  
  1812.     MF3D_Free(inObj);
  1813.     return kMF3DNoErr;
  1814. }
  1815.  
  1816. /*==============================================================================
  1817.  *    MF3D_ObjDisplayGroupStateReader
  1818.  *==============================================================================
  1819.  */
  1820. MF3DErr
  1821. MF3D_ObjDisplayGroupStateReader(
  1822.     MF3D_FilePtr    inMetafilePtr,
  1823.     MF3DVoidObjPtr    *outObj)
  1824. {
  1825.     MF3DDisplayGroupStateObjPtr    returnObj;
  1826.     MF3DErr                        result;
  1827.  
  1828.     result = kMF3DNoErr;
  1829.  
  1830.     MF3D_Allocate(returnObj);
  1831.  
  1832.     if (result == kMF3DNoErr)
  1833.     {    result = MF3D_FlagsRead(inMetafilePtr, gMF3D_DisplayGroupStateFlags,
  1834.                 &returnObj->traversalFlags);
  1835.     }
  1836.  
  1837.     if (result == kMF3DNoErr)
  1838.         *outObj = (MF3DVoidObjPtr) returnObj;
  1839.     else
  1840.         MF3D_Free(returnObj);
  1841.  
  1842.     return result;
  1843. }
  1844.  
  1845. /*==============================================================================
  1846.  *    MF3D_ObjDisplayGroupStateWriter
  1847.  *==============================================================================
  1848.  */
  1849. MF3DErr
  1850. MF3D_ObjDisplayGroupStateWriter(
  1851.     MF3D_FilePtr    inMetafilePtr,
  1852.     MF3DVoidObjPtr    inObj)
  1853. {
  1854.     MF3D_VerifyObjectType(inObj, kMF3DObjDisplayGroupState);
  1855.  
  1856.     return MF3D_FlagsWrite(inMetafilePtr, gMF3D_DisplayGroupStateFlags,
  1857.                 ((MF3DDisplayGroupStateObjPtr)inObj)->traversalFlags);
  1858. }
  1859.  
  1860. /*==============================================================================
  1861.  *    MF3D_ObjDisplayGroupStateDisposer
  1862.  *==============================================================================
  1863.  */
  1864. MF3DErr
  1865. MF3D_ObjDisplayGroupStateDisposer(
  1866.     MF3DVoidObjPtr    inObj)
  1867. {
  1868.     MF3D_VerifyObjectType(inObj, kMF3DObjDisplayGroupState);
  1869.  
  1870.     MF3D_Free(inObj);
  1871.     return kMF3DNoErr;
  1872. }
  1873.  
  1874. /*==============================================================================
  1875.  *    MF3D_ObjLightDataReader
  1876.  *==============================================================================
  1877.  */
  1878. MF3DErr
  1879. MF3D_ObjLightDataReader(
  1880.     MF3D_FilePtr    inMetafilePtr,
  1881.     MF3DVoidObjPtr    *outObj)
  1882. {
  1883.     MF3DLightDataObjPtr            returnObj;
  1884.     MF3DErr                        result;
  1885.  
  1886.     result = kMF3DNoErr;
  1887.  
  1888.     MF3D_Allocate(returnObj);
  1889.  
  1890.     if (result == kMF3DNoErr)
  1891.         MF3D_BooleanRead(inMetafilePtr, &returnObj->isOn);
  1892.  
  1893.     if (result == kMF3DNoErr)
  1894.         MF3D_Float32Read(inMetafilePtr, &returnObj->intensity);
  1895.  
  1896.     if (result == kMF3DNoErr)
  1897.         MF3D_RGBColorRead(inMetafilePtr, &returnObj->color);
  1898.  
  1899.     if (result == kMF3DNoErr)
  1900.         *outObj = (MF3DVoidObjPtr) returnObj;
  1901.     else
  1902.         MF3D_Free(returnObj);
  1903.  
  1904.     return result;
  1905. }
  1906.  
  1907. /*==============================================================================
  1908.  *    MF3D_ObjLightDataWriter
  1909.  *==============================================================================
  1910.  */
  1911. MF3DErr
  1912. MF3D_ObjLightDataWriter(
  1913.     MF3D_FilePtr    inMetafilePtr,
  1914.     MF3DVoidObjPtr    inObj)
  1915. {
  1916.     MF3DLightDataObjPtr            writeObj;
  1917.     MF3DErr                        result;
  1918.  
  1919.     MF3D_VerifyObjectType(inObj, kMF3DObjLightData);
  1920.     writeObj = (MF3DLightDataObjPtr)inObj;
  1921.  
  1922.     result = MF3D_BooleanWrite(inMetafilePtr, writeObj->isOn);
  1923.  
  1924.     if (result == kMF3DNoErr)
  1925.         result = MF3D_Float32Write(inMetafilePtr, writeObj->intensity);
  1926.  
  1927.     if (result == kMF3DNoErr)
  1928.         result = MF3D_RGBColorWrite(inMetafilePtr, writeObj->color);
  1929.  
  1930.     return result;
  1931. }
  1932.  
  1933. /*==============================================================================
  1934.  *    MF3D_ObjLightDataDisposer
  1935.  *==============================================================================
  1936.  */
  1937. MF3DErr
  1938. MF3D_ObjLightDataDisposer(
  1939.     MF3DVoidObjPtr    inObj)
  1940. {
  1941.     MF3D_VerifyObjectType(inObj, kMF3DObjLightData);
  1942.  
  1943.     MF3D_Free(inObj);
  1944.     return kMF3DNoErr;
  1945. }
  1946.  
  1947. /*==============================================================================
  1948.  *    MF3D_ObjMeshCornersReader
  1949.  *==============================================================================
  1950.  */
  1951. MF3DErr
  1952. MF3D_ObjMeshCornersReader(
  1953.     MF3D_FilePtr    inMetafilePtr,
  1954.     MF3DVoidObjPtr    *outObj)
  1955. {
  1956.     MF3DMeshCornersObjPtr        returnObj;
  1957.     MF3DErr                        result;
  1958.     MF3DUns32                    numCorners;
  1959.  
  1960.     result = kMF3DNoErr;
  1961.  
  1962.     MF3D_Allocate(returnObj);
  1963.  
  1964.     if (result == kMF3DNoErr)
  1965.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nCorners);
  1966.  
  1967.     if (result == kMF3DNoErr)
  1968.     {    numCorners = returnObj->nCorners;
  1969.         if (numCorners <= 0)
  1970.             result = kMF3DErrNumCornersIsZero;
  1971.     }
  1972.  
  1973.     if (result == kMF3DNoErr)
  1974.     {    MF3DMeshCornerPtr    curCornerPtr;
  1975.  
  1976.         returnObj->corners = MF3D_Malloc(numCorners *
  1977.                 sizeof(*returnObj->corners));
  1978.         if (returnObj->corners == NULL)
  1979.             result = kMF3DErrOutOfMemory;
  1980.  
  1981.         curCornerPtr = returnObj->corners;
  1982.         while (result == kMF3DNoErr && numCorners > 0)
  1983.         {    MF3DUns32        numFaces;
  1984.  
  1985.             result = MF3D_Uns32Read(inMetafilePtr, &curCornerPtr->vertexIndex);
  1986.  
  1987.             if (result == kMF3DNoErr)
  1988.                 result = MF3D_Uns32Read(inMetafilePtr, &curCornerPtr->nFaces);
  1989.  
  1990.             if (result == kMF3DNoErr)
  1991.             {    numFaces = curCornerPtr->nFaces;
  1992.                 if (numFaces <= 0)
  1993.                     result = kMF3DErrNumFacesIsZero;
  1994.             }
  1995.  
  1996.             if (result == kMF3DNoErr)
  1997.             {    MF3DUns32Ptr    curFacePtr;
  1998.     
  1999.                 curCornerPtr->faces = MF3D_Malloc(numFaces *
  2000.                         sizeof(*curCornerPtr->faces));
  2001.                 if (curCornerPtr->faces == NULL)
  2002.                     result = kMF3DErrOutOfMemory;
  2003.  
  2004.                 curFacePtr = curCornerPtr->faces;
  2005.                 while (result == kMF3DNoErr && numFaces > 0)
  2006.                 {    result = MF3D_Uns32Read(inMetafilePtr, curFacePtr);
  2007.                     --numFaces;
  2008.                     ++curFacePtr;
  2009.                 }
  2010.  
  2011.                 if (result != kMF3DNoErr)
  2012.                 {    MF3D_Free(curCornerPtr->faces);
  2013.                 }
  2014.             }
  2015.  
  2016.             --numCorners;
  2017.             ++curCornerPtr;
  2018.         }
  2019.  
  2020.         if (result != kMF3DNoErr)
  2021.         {    MF3D_Free(returnObj->corners);
  2022.         }
  2023.     }
  2024.  
  2025.     if (result == kMF3DNoErr)
  2026.         *outObj = (MF3DVoidObjPtr) returnObj;
  2027.     else
  2028.         MF3D_Free(returnObj);
  2029.  
  2030.     return result;
  2031. }
  2032.  
  2033. /*==============================================================================
  2034.  *    MF3D_ObjMeshCornersWriter
  2035.  *==============================================================================
  2036.  */
  2037. MF3DErr
  2038. MF3D_ObjMeshCornersWriter(
  2039.     MF3D_FilePtr    inMetafilePtr,
  2040.     MF3DVoidObjPtr    inObj)
  2041. {
  2042.     MF3DMeshCornersObjPtr        writeObj;
  2043.     MF3DUns32                    nCorners;
  2044.     MF3DErr                        result;
  2045.  
  2046.     MF3D_VerifyObjectType(inObj, kMF3DObjMeshCorners);
  2047.     writeObj = (MF3DMeshCornersObjPtr)inObj;
  2048.  
  2049.     result = kMF3DNoErr;
  2050.  
  2051.     nCorners = writeObj->nCorners;
  2052.     if (nCorners <= 0)
  2053.         result = kMF3DErrNumCornersIsZero;
  2054.  
  2055.     if (result == kMF3DNoErr)
  2056.     {    MF3D_WriteNewLine(inMetafilePtr);
  2057.         result = MF3D_Uns32Write(inMetafilePtr, nCorners);
  2058.     }
  2059.  
  2060.     if (result == kMF3DNoErr)
  2061.         MF3D_CommentStrWrite(inMetafilePtr, "nCorners");
  2062.  
  2063.     if (result == kMF3DNoErr)
  2064.     {    MF3DUns32            cornerNum;
  2065.         MF3DMeshCornerPtr    curCornerPtr;
  2066.         
  2067.         curCornerPtr = writeObj->corners;
  2068.         for (cornerNum = 0;
  2069.                 result == kMF3DNoErr && cornerNum < nCorners;
  2070.                 ++cornerNum)
  2071.         {    MF3DUns32        nFaces;
  2072.  
  2073.             result = MF3D_Uns32Write(inMetafilePtr, curCornerPtr->vertexIndex);
  2074.  
  2075.             nFaces = curCornerPtr->nFaces;
  2076.             if (nFaces <= 0)
  2077.                 result = kMF3DErrNumFacesIsZero;
  2078.  
  2079.             if (result == kMF3DNoErr)
  2080.                 result = MF3D_Uns32Write(inMetafilePtr, nFaces);
  2081.  
  2082.             if (result == kMF3DNoErr)
  2083.             {    MF3DUns32Ptr    curFacePtr;
  2084.     
  2085.                 curFacePtr = curCornerPtr->faces;
  2086.                 for ( ; result == kMF3DNoErr && nFaces > 0; --nFaces)
  2087.                 {    result = MF3D_Uns32Write(inMetafilePtr, *curFacePtr++);
  2088.                 }
  2089.             }
  2090.             if (result == kMF3DNoErr)
  2091.                 MF3D_CommentNumWrite(inMetafilePtr, cornerNum);
  2092.             ++curCornerPtr;
  2093.         }
  2094.     }
  2095.  
  2096.     return result;
  2097. }
  2098.  
  2099. /*==============================================================================
  2100.  *    MF3D_ObjMeshCornersDisposer
  2101.  *==============================================================================
  2102.  */
  2103. MF3DErr
  2104. MF3D_ObjMeshCornersDisposer(
  2105.     MF3DVoidObjPtr    inObj)
  2106. {
  2107.     MF3DMeshCornersObjPtr    mcObj;
  2108.  
  2109.     MF3D_VerifyObjectType(inObj, kMF3DObjMeshCorners);
  2110.  
  2111.     mcObj = (MF3DMeshCornersObjPtr) inObj;
  2112.  
  2113.     if (mcObj != NULL && mcObj->corners != NULL)
  2114.     {    MF3DUns32            numCorners;
  2115.         MF3DMeshCornerPtr    cornerPtr;
  2116.  
  2117.         cornerPtr = mcObj->corners;
  2118.         for (numCorners = mcObj->nCorners; numCorners > 0; --numCorners)
  2119.         {    MF3D_Free(cornerPtr->faces);
  2120.             ++cornerPtr;
  2121.         }
  2122.  
  2123.         MF3D_Free(mcObj->corners);
  2124.     }
  2125.     MF3D_Free(mcObj);
  2126.     return kMF3DNoErr;
  2127. }
  2128.  
  2129. /*==============================================================================
  2130.  *    MF3D_ObjMeshEdgesReader
  2131.  *==============================================================================
  2132.  */
  2133. MF3DErr
  2134. MF3D_ObjMeshEdgesReader(
  2135.     MF3D_FilePtr    inMetafilePtr,
  2136.     MF3DVoidObjPtr    *outObj)
  2137. {
  2138.     MF3DMeshEdgesObjPtr            returnObj;
  2139.     MF3DErr                        result;
  2140.     MF3DUns32                    numEdges;
  2141.  
  2142.     result = kMF3DNoErr;
  2143.  
  2144.     MF3D_Allocate(returnObj);
  2145.  
  2146.     if (result == kMF3DNoErr)
  2147.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nEdges);
  2148.  
  2149.     if (result == kMF3DNoErr)
  2150.     {    numEdges = returnObj->nEdges;
  2151.         if (numEdges <= 0)
  2152.             result = kMF3DErrNumEdgesIsZero;
  2153.     }
  2154.  
  2155.     if (result == kMF3DNoErr)
  2156.     {    MF3DMeshEdgePtr        curEdgePtr;
  2157.  
  2158.         returnObj->edges = MF3D_Malloc(numEdges * sizeof(*returnObj->edges));
  2159.         if (returnObj->edges == NULL)
  2160.             result = kMF3DErrOutOfMemory;
  2161.  
  2162.         curEdgePtr = returnObj->edges;
  2163.         while (result == kMF3DNoErr && numEdges > 0)
  2164.         {    result = MF3D_Uns32Read(inMetafilePtr, &curEdgePtr->vertexIndex1);
  2165.  
  2166.             if (result == kMF3DNoErr)
  2167.             {    result = MF3D_Uns32Read(inMetafilePtr,
  2168.                         &curEdgePtr->vertexIndex2);
  2169.             }
  2170.  
  2171.             --numEdges;
  2172.             ++curEdgePtr;
  2173.         }
  2174.  
  2175.         if (result != kMF3DNoErr)
  2176.         {    MF3D_Free(returnObj->edges);
  2177.         }
  2178.     }
  2179.  
  2180.     if (result == kMF3DNoErr)
  2181.         *outObj = (MF3DVoidObjPtr) returnObj;
  2182.     else
  2183.         MF3D_Free(returnObj);
  2184.  
  2185.     return result;
  2186. }
  2187.  
  2188. /*==============================================================================
  2189.  *    MF3D_ObjMeshEdgesWriter
  2190.  *==============================================================================
  2191.  */
  2192. MF3DErr
  2193. MF3D_ObjMeshEdgesWriter(
  2194.     MF3D_FilePtr    inMetafilePtr,
  2195.     MF3DVoidObjPtr    inObj)
  2196. {
  2197.     MF3DMeshEdgesObjPtr            writeObj;
  2198.     MF3DUns32                    nEdges;
  2199.     MF3DErr                        result;
  2200.  
  2201.     MF3D_VerifyObjectType(inObj, kMF3DObjMeshEdges);
  2202.     writeObj = (MF3DMeshEdgesObjPtr) inObj;
  2203.  
  2204.     result = kMF3DNoErr;
  2205.  
  2206.     nEdges = writeObj->nEdges;
  2207.     if (nEdges <= 0)
  2208.         result = kMF3DErrNumEdgesIsZero;
  2209.  
  2210.     if (result == kMF3DNoErr)
  2211.     {    MF3D_WriteNewLine(inMetafilePtr);
  2212.         result = MF3D_Uns32Write(inMetafilePtr, nEdges);
  2213.     }
  2214.  
  2215.     if (result == kMF3DNoErr)
  2216.         MF3D_CommentStrWrite(inMetafilePtr, "nEdges");
  2217.  
  2218.     if (result == kMF3DNoErr)
  2219.     {    MF3DUns32            edgeNum;
  2220.         MF3DMeshEdgePtr        curEdgePtr;
  2221.         
  2222.         curEdgePtr = writeObj->edges;
  2223.         for (edgeNum = 0;
  2224.                 result == kMF3DNoErr && edgeNum < nEdges;
  2225.                 ++edgeNum)
  2226.         {    result = MF3D_Uns32Write(inMetafilePtr, curEdgePtr->vertexIndex1);
  2227.  
  2228.             if (result == kMF3DNoErr)
  2229.             {    result = MF3D_Uns32Write(inMetafilePtr,
  2230.                         curEdgePtr->vertexIndex2);
  2231.             }
  2232.  
  2233.             if (result == kMF3DNoErr)
  2234.                 MF3D_CommentNumWrite(inMetafilePtr, edgeNum);
  2235.  
  2236.             ++curEdgePtr;
  2237.         }
  2238.     }
  2239.  
  2240.     return result;
  2241. }
  2242.  
  2243. /*==============================================================================
  2244.  *    MF3D_ObjMeshEdgesDisposer
  2245.  *==============================================================================
  2246.  */
  2247. MF3DErr
  2248. MF3D_ObjMeshEdgesDisposer(
  2249.     MF3DVoidObjPtr    inObj)
  2250. {
  2251.     MF3D_VerifyObjectType(inObj, kMF3DObjMeshEdges);
  2252.  
  2253.     if (inObj != NULL)
  2254.     {    MF3D_Free(((MF3DMeshEdgesObjPtr)inObj)->edges);
  2255.         MF3D_Free(inObj);
  2256.     }
  2257.  
  2258.     return kMF3DNoErr;
  2259. }
  2260.  
  2261. /*==============================================================================
  2262.  *    MF3D_ObjNURBCurve2DReader
  2263.  *==============================================================================
  2264.  */
  2265. MF3DErr
  2266. MF3D_ObjNURBCurve2DReader(
  2267.     MF3D_FilePtr    inMetafilePtr,
  2268.     MF3DVoidObjPtr    *outObj)
  2269. {
  2270.     MF3DNURBCurve2DObjPtr        returnObj;
  2271.     MF3DUns32                    numPoints;
  2272.     MF3DUns32                    order;
  2273.     MF3DUns32                    numKnots;
  2274.     MF3DErr                        result;
  2275.  
  2276.     result = kMF3DNoErr;
  2277.  
  2278.     MF3D_Allocate(returnObj);
  2279.  
  2280.     if (result == kMF3DNoErr)
  2281.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->order);
  2282.  
  2283.     if (result == kMF3DNoErr)
  2284.     {    order = returnObj->order;
  2285.         if (order < 2)
  2286.             result = kMF3DErrOrderTooSmall;
  2287.     }
  2288.  
  2289.     if (result == kMF3DNoErr)
  2290.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nPoints);
  2291.  
  2292.     if (result == kMF3DNoErr)
  2293.     {    numPoints = returnObj->nPoints;
  2294.         numKnots = numPoints + order;
  2295.         if (numPoints < 2)
  2296.             result = kMF3DErrTooFewPoints;
  2297.     }
  2298.  
  2299.     if (result == kMF3DNoErr)
  2300.     {    MF3DRationalPoint3DPtr    curPointPtr;
  2301.  
  2302.         returnObj->points = MF3D_Malloc(numPoints * sizeof(*returnObj->points));
  2303.         if (returnObj->points == NULL)
  2304.             result = kMF3DErrOutOfMemory;
  2305.  
  2306.         curPointPtr = returnObj->points;
  2307.         while (result == kMF3DNoErr && numPoints > 0)
  2308.         {    result = MF3D_RationalPoint3DRead(inMetafilePtr, curPointPtr);
  2309.             --numPoints;
  2310.             ++curPointPtr;
  2311.         }
  2312.  
  2313.         if (result != kMF3DNoErr)
  2314.         {    MF3D_Free(returnObj->points);
  2315.         }
  2316.     }
  2317.  
  2318.     if (result == kMF3DNoErr)
  2319.     {    MF3DKnotPtr        curKnotPtr;
  2320.  
  2321.         returnObj->knots = MF3D_Malloc(numKnots * sizeof(*returnObj->knots));
  2322.         if (returnObj->knots == NULL)
  2323.             result = kMF3DErrOutOfMemory;
  2324.  
  2325.         curKnotPtr = returnObj->knots;
  2326.         while (result == kMF3DNoErr && numKnots > 0)
  2327.         {    result = MF3D_Float32Read(inMetafilePtr, curKnotPtr);
  2328.             --numKnots;
  2329.             ++curKnotPtr;
  2330.         }
  2331.  
  2332.         if (result != kMF3DNoErr)
  2333.         {    MF3D_Free(returnObj->knots);
  2334.         }
  2335.     }
  2336.  
  2337.     if (result == kMF3DNoErr)
  2338.         *outObj = (MF3DVoidObjPtr) returnObj;
  2339.     else
  2340.         MF3D_Free(returnObj);
  2341.  
  2342.     return result;
  2343. }
  2344.  
  2345. /*==============================================================================
  2346.  *    MF3D_ObjNURBCurve2DWriter
  2347.  *==============================================================================
  2348.  */
  2349. MF3DErr
  2350. MF3D_ObjNURBCurve2DWriter(
  2351.     MF3D_FilePtr    inMetafilePtr,
  2352.     MF3DVoidObjPtr    inObj)
  2353. {
  2354.     MF3DNURBCurve2DObjPtr        writeObj;
  2355.     MF3DUns32                    numPoints;
  2356.     MF3DUns32                    order;
  2357.     MF3DUns32                    numKnots;
  2358.     MF3DErr                        result;
  2359.  
  2360.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBCurve2D);
  2361.     writeObj = (MF3DNURBCurve2DObjPtr)inObj;
  2362.  
  2363.     result = kMF3DNoErr;
  2364.  
  2365.     order = writeObj->order;
  2366.     if (order < 2)
  2367.         result = kMF3DErrOrderTooSmall;
  2368.  
  2369.     if (result == kMF3DNoErr)
  2370.         result = MF3D_Uns32Write(inMetafilePtr, order);
  2371.  
  2372.     if (result == kMF3DNoErr)
  2373.         MF3D_CommentStrWrite(inMetafilePtr, "order");
  2374.  
  2375.     if (result == kMF3DNoErr)
  2376.     {    numPoints = writeObj->nPoints;
  2377.         if (numPoints < 2)
  2378.             result = kMF3DErrTooFewPoints;
  2379.     }
  2380.  
  2381.     if (result == kMF3DNoErr)
  2382.         result = MF3D_Uns32Write(inMetafilePtr, numPoints);
  2383.  
  2384.     if (result == kMF3DNoErr)
  2385.         MF3D_CommentStrWrite(inMetafilePtr, "nPoints");
  2386.  
  2387.     if (result == kMF3DNoErr)
  2388.     {    MF3DRationalPoint3DPtr    curPointPtr;
  2389.         MF3DUns32                pointNum;
  2390.  
  2391.         curPointPtr = writeObj->points;
  2392.         for (pointNum = 0;
  2393.                 result == kMF3DNoErr && pointNum < numPoints;
  2394.                 ++pointNum)
  2395.         {    result = MF3D_RationalPoint3DWrite(inMetafilePtr, *curPointPtr++);
  2396.             if (result == kMF3DNoErr)
  2397.                 MF3D_CommentNumWrite(inMetafilePtr, pointNum);
  2398.         }
  2399.     }
  2400.  
  2401.     if (result == kMF3DNoErr)
  2402.     {    MF3DKnotPtr        curKnotPtr;
  2403.         MF3DUns32        knotNum;
  2404.  
  2405.         MF3D_CommentStrWrite(inMetafilePtr, "knots");
  2406.  
  2407.         numKnots = numPoints + order;
  2408.  
  2409.         curKnotPtr = writeObj->knots;
  2410.         for (knotNum = 0; result == kMF3DNoErr && knotNum < numKnots; ++knotNum)
  2411.         {    result = MF3D_Float32Write(inMetafilePtr, *curKnotPtr++);
  2412.             if (result == kMF3DNoErr)
  2413.                 MF3D_CommentNumWrite(inMetafilePtr, knotNum);
  2414.         }
  2415.     }
  2416.  
  2417.     return result;
  2418. }
  2419.  
  2420. /*==============================================================================
  2421.  *    MF3D_ObjNURBCurve2DDisposer
  2422.  *==============================================================================
  2423.  */
  2424. MF3DErr
  2425. MF3D_ObjNURBCurve2DDisposer(
  2426.     MF3DVoidObjPtr    inObj)
  2427. {
  2428.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBCurve2D);
  2429.  
  2430.     if (inObj != NULL)
  2431.     {    MF3D_Free(((MF3DNURBCurve2DObjPtr)inObj)->points);
  2432.         MF3D_Free(((MF3DNURBCurve2DObjPtr)inObj)->knots);
  2433.         MF3D_Free(inObj);
  2434.     }
  2435.     return kMF3DNoErr;
  2436. }
  2437.  
  2438. /*==============================================================================
  2439.  *    MF3D_ObjShaderDataReader
  2440.  *==============================================================================
  2441.  */
  2442. MF3DErr
  2443. MF3D_ObjShaderDataReader(
  2444.     MF3D_FilePtr    inMetafilePtr,
  2445.     MF3DVoidObjPtr    *outObj)
  2446. {
  2447.     MF3DShaderDataObjPtr        returnObj;
  2448.     MF3DErr                        result;
  2449.  
  2450.     result = kMF3DNoErr;
  2451.  
  2452.     MF3D_Allocate(returnObj);
  2453.  
  2454.     if (result == kMF3DNoErr)
  2455.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_ShaderUVBoundaryEnum,
  2456.                 &returnObj->uBounds);
  2457.     }
  2458.  
  2459.     if (result == kMF3DNoErr)
  2460.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_ShaderUVBoundaryEnum,
  2461.                 &returnObj->vBounds);
  2462.     }
  2463.  
  2464.     if (result == kMF3DNoErr)
  2465.         *outObj = (MF3DVoidObjPtr) returnObj;
  2466.     else
  2467.         MF3D_Free(returnObj);
  2468.  
  2469.     return result;
  2470. }
  2471.  
  2472. /*==============================================================================
  2473.  *    MF3D_ObjShaderDataWriter
  2474.  *==============================================================================
  2475.  */
  2476. MF3DErr
  2477. MF3D_ObjShaderDataWriter(
  2478.     MF3D_FilePtr    inMetafilePtr,
  2479.     MF3DVoidObjPtr    inObj)
  2480. {
  2481.     MF3DShaderDataObjPtr        writeObj;
  2482.     MF3DErr                        result;
  2483.  
  2484.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderData);
  2485.     writeObj = (MF3DShaderDataObjPtr)inObj;
  2486.  
  2487.     result = MF3D_EnumWrite(inMetafilePtr, gMF3D_ShaderUVBoundaryEnum,
  2488.             writeObj->uBounds);
  2489.  
  2490.     if (result == kMF3DNoErr)
  2491.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_ShaderUVBoundaryEnum,
  2492.                 writeObj->vBounds);
  2493.     }
  2494.     return result;
  2495. }
  2496.  
  2497. /*==============================================================================
  2498.  *    MF3D_ObjShaderDataDisposer
  2499.  *==============================================================================
  2500.  */
  2501. MF3DErr
  2502. MF3D_ObjShaderDataDisposer(
  2503.     MF3DVoidObjPtr    inObj)
  2504. {
  2505.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderData);
  2506.  
  2507.     MF3D_Free(inObj);
  2508.     return kMF3DNoErr;
  2509. }
  2510.  
  2511. /*==============================================================================
  2512.  *    MF3D_ObjShaderTransformReader
  2513.  *==============================================================================
  2514.  */
  2515. MF3DErr
  2516. MF3D_ObjShaderTransformReader(
  2517.     MF3D_FilePtr    inMetafilePtr,
  2518.     MF3DVoidObjPtr    *outObj)
  2519. {
  2520.     MF3DShaderTransformObjPtr    returnObj;
  2521.     MF3DErr                        result;
  2522.  
  2523.     result = kMF3DNoErr;
  2524.  
  2525.     MF3D_Allocate(returnObj);
  2526.  
  2527.     if (result == kMF3DNoErr)
  2528.     {    result = MF3D_Matrix4x4Read(inMetafilePtr, returnObj->shaderTransform);
  2529.     }
  2530.  
  2531.     if (result == kMF3DNoErr)
  2532.         *outObj = (MF3DVoidObjPtr) returnObj;
  2533.     else
  2534.         MF3D_Free(returnObj);
  2535.  
  2536.     return result;
  2537. }
  2538.  
  2539. /*==============================================================================
  2540.  *    MF3D_ObjShaderTransformWriter
  2541.  *==============================================================================
  2542.  */
  2543. MF3DErr
  2544. MF3D_ObjShaderTransformWriter(
  2545.     MF3D_FilePtr    inMetafilePtr,
  2546.     MF3DVoidObjPtr    inObj)
  2547. {
  2548.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderTransform);
  2549.     MF3D_WriteNewLine(inMetafilePtr);
  2550.     return MF3D_Matrix4x4Write(inMetafilePtr,
  2551.             ((MF3DShaderTransformObj *)inObj)->shaderTransform);
  2552. }
  2553.  
  2554. /*==============================================================================
  2555.  *    MF3D_ObjShaderTransformDisposer
  2556.  *==============================================================================
  2557.  */
  2558. MF3DErr
  2559. MF3D_ObjShaderTransformDisposer(
  2560.     MF3DVoidObjPtr    inObj)
  2561. {
  2562.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderTransform);
  2563.  
  2564.     MF3D_Free(inObj);
  2565.     return kMF3DNoErr;
  2566. }
  2567.  
  2568. /*==============================================================================
  2569.  *    MF3D_ObjShaderUVTransformReader
  2570.  *==============================================================================
  2571.  */
  2572. MF3DErr
  2573. MF3D_ObjShaderUVTransformReader(
  2574.     MF3D_FilePtr    inMetafilePtr,
  2575.     MF3DVoidObjPtr    *outObj)
  2576. {
  2577.     MF3DShaderUVTransformObjPtr    returnObj;
  2578.     MF3DErr                        result;
  2579.  
  2580.     result = kMF3DNoErr;
  2581.  
  2582.     MF3D_Allocate(returnObj);
  2583.  
  2584.     if (result == kMF3DNoErr)
  2585.     {    result = MF3D_Matrix3x3Read(inMetafilePtr, returnObj->matrix);
  2586.     }
  2587.  
  2588.     if (result == kMF3DNoErr)
  2589.         *outObj = (MF3DVoidObjPtr) returnObj;
  2590.     else
  2591.         MF3D_Free(returnObj);
  2592.  
  2593.     return result;
  2594. }
  2595.  
  2596. /*==============================================================================
  2597.  *    MF3D_ObjShaderUVTransformWriter
  2598.  *==============================================================================
  2599.  */
  2600. MF3DErr
  2601. MF3D_ObjShaderUVTransformWriter(
  2602.     MF3D_FilePtr    inMetafilePtr,
  2603.     MF3DVoidObjPtr    inObj)
  2604. {
  2605.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderUVTransform);
  2606.     MF3D_WriteNewLine(inMetafilePtr);
  2607.     return MF3D_Matrix3x3Write(inMetafilePtr,
  2608.             ((MF3DShaderUVTransformObj *)inObj)->matrix);
  2609. }
  2610.  
  2611. /*==============================================================================
  2612.  *    MF3D_ObjShaderUVTransformDisposer
  2613.  *==============================================================================
  2614.  */
  2615. MF3DErr
  2616. MF3D_ObjShaderUVTransformDisposer(
  2617.     MF3DVoidObjPtr    inObj)
  2618. {
  2619.     MF3D_VerifyObjectType(inObj, kMF3DObjShaderUVTransform);
  2620.  
  2621.     MF3D_Free(inObj);
  2622.     return kMF3DNoErr;
  2623. }
  2624.  
  2625. /*==============================================================================
  2626.  *    MF3D_ObjTrimCurvesReader
  2627.  *==============================================================================
  2628.  */
  2629. MF3DErr
  2630. MF3D_ObjTrimCurvesReader(
  2631.     MF3D_FilePtr    inMetafilePtr,
  2632.     MF3DVoidObjPtr    *outObj)
  2633. {
  2634.     MF3DTrimCurvesObjPtr        returnObj;
  2635.     MF3DErr                        result;
  2636.  
  2637.     MF3D_Unused(inMetafilePtr);
  2638.     result = kMF3DNoErr;
  2639.  
  2640.     MF3D_Allocate(returnObj);
  2641.  
  2642.     if (result == kMF3DNoErr)
  2643.         *outObj = (MF3DVoidObjPtr) returnObj;
  2644.     else
  2645.         MF3D_Free(returnObj);
  2646.  
  2647.     return result;
  2648. }
  2649.  
  2650. /*==============================================================================
  2651.  *    MF3D_ObjTrimCurvesWriter
  2652.  *==============================================================================
  2653.  */
  2654. MF3DErr
  2655. MF3D_ObjTrimCurvesWriter(
  2656.     MF3D_FilePtr    inMetafilePtr,
  2657.     MF3DVoidObjPtr    inObj)
  2658. {
  2659.     MF3D_VerifyObjectType(inObj, kMF3DObjTrimCurves);
  2660.     MF3D_Unused(inMetafilePtr);
  2661.     MF3D_Unused(inObj);
  2662.     /* Nothing to write! */
  2663.     return kMF3DNoErr;
  2664. }
  2665.  
  2666. /*==============================================================================
  2667.  *    MF3D_ObjTrimCurvesDisposer
  2668.  *==============================================================================
  2669.  */
  2670. MF3DErr
  2671. MF3D_ObjTrimCurvesDisposer(
  2672.     MF3DVoidObjPtr    inObj)
  2673. {
  2674.     MF3D_VerifyObjectType(inObj, kMF3DObjTrimCurves);
  2675.  
  2676.     MF3D_Free(inObj);
  2677.     return kMF3DNoErr;
  2678. }
  2679.  
  2680. /*==============================================================================
  2681.  *    MF3D_ObjImageClearColorReader
  2682.  *==============================================================================
  2683.  */
  2684. MF3DErr
  2685. MF3D_ObjImageClearColorReader(
  2686.     MF3D_FilePtr    inMetafilePtr,
  2687.     MF3DVoidObjPtr    *outObj)
  2688. {
  2689.     MF3DImageClearColorObjPtr    returnObj;
  2690.     MF3DErr                        result;
  2691.  
  2692.     result = kMF3DNoErr;
  2693.  
  2694.     MF3D_Allocate(returnObj);
  2695.  
  2696.     if (result == kMF3DNoErr)
  2697.         result = MF3D_RGBColorRead(inMetafilePtr, &returnObj->clearColor);
  2698.  
  2699.     if (result == kMF3DNoErr)
  2700.         *outObj = (MF3DVoidObjPtr) returnObj;
  2701.     else
  2702.         MF3D_Free(returnObj);
  2703.  
  2704.     return result;
  2705. }
  2706.  
  2707. /*==============================================================================
  2708.  *    MF3D_ObjImageClearColorWriter
  2709.  *==============================================================================
  2710.  */
  2711. MF3DErr
  2712. MF3D_ObjImageClearColorWriter(
  2713.     MF3D_FilePtr    inMetafilePtr,
  2714.     MF3DVoidObjPtr    inObj)
  2715. {
  2716.     MF3D_VerifyObjectType(inObj, kMF3DObjImageClearColor);
  2717.     return MF3D_RGBColorWrite(inMetafilePtr,
  2718.             ((MF3DImageClearColorObjPtr)inObj)->clearColor);
  2719. }
  2720.  
  2721. /*==============================================================================
  2722.  *    MF3D_ObjImageClearColorDisposer
  2723.  *==============================================================================
  2724.  */
  2725. MF3DErr
  2726. MF3D_ObjImageClearColorDisposer(
  2727.     MF3DVoidObjPtr    inObj)
  2728. {
  2729.     MF3D_VerifyObjectType(inObj, kMF3DObjImageClearColor);
  2730.  
  2731.     MF3D_Free(inObj);
  2732.     return kMF3DNoErr;
  2733. }
  2734.  
  2735. /*==============================================================================
  2736.  *    MF3D_ObjImageDimensionsReader
  2737.  *==============================================================================
  2738.  */
  2739. MF3DErr
  2740. MF3D_ObjImageDimensionsReader(
  2741.     MF3D_FilePtr    inMetafilePtr,
  2742.     MF3DVoidObjPtr    *outObj)
  2743. {
  2744.     MF3DImageDimensionsObjPtr    returnObj;
  2745.     MF3DErr                        result;
  2746.  
  2747.     result = kMF3DNoErr;
  2748.  
  2749.     MF3D_Allocate(returnObj);
  2750.  
  2751.     if (result == kMF3DNoErr)
  2752.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->width);
  2753.  
  2754.     if (result == kMF3DNoErr)
  2755.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->height);
  2756.  
  2757.     if (result == kMF3DNoErr)
  2758.         *outObj = (MF3DVoidObjPtr) returnObj;
  2759.     else
  2760.         MF3D_Free(returnObj);
  2761.  
  2762.     return result;
  2763. }
  2764.  
  2765. /*==============================================================================
  2766.  *    MF3D_ObjImageDimensionsWriter
  2767.  *==============================================================================
  2768.  */
  2769. MF3DErr
  2770. MF3D_ObjImageDimensionsWriter(
  2771.     MF3D_FilePtr    inMetafilePtr,
  2772.     MF3DVoidObjPtr    inObj)
  2773. {
  2774.     MF3DImageDimensionsObjPtr    writeObj;
  2775.     MF3DErr                        result;
  2776.  
  2777.     MF3D_VerifyObjectType(inObj, kMF3DObjImageDimensions);
  2778.     writeObj = (MF3DImageDimensionsObjPtr)inObj;
  2779.  
  2780.     result = MF3D_Uns32Write(inMetafilePtr, writeObj->width);
  2781.  
  2782.     if (result == kMF3DNoErr)
  2783.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->height);
  2784.  
  2785.     return result;
  2786. }
  2787.  
  2788. /*==============================================================================
  2789.  *    MF3D_ObjImageDimensionsDisposer
  2790.  *==============================================================================
  2791.  */
  2792. MF3DErr
  2793. MF3D_ObjImageDimensionsDisposer(
  2794.     MF3DVoidObjPtr    inObj)
  2795. {
  2796.     MF3D_VerifyObjectType(inObj, kMF3DObjImageDimensions);
  2797.  
  2798.     MF3D_Free(inObj);
  2799.     return kMF3DNoErr;
  2800. }
  2801.  
  2802. /*==============================================================================
  2803.  *    MF3D_ObjImageMaskReader
  2804.  *==============================================================================
  2805.  */
  2806. MF3DErr
  2807. MF3D_ObjImageMaskReader(
  2808.     MF3D_FilePtr    inMetafilePtr,
  2809.     MF3DVoidObjPtr    *outObj)
  2810. {
  2811.     MF3DImageMaskObjPtr            returnObj;
  2812.     MF3DUns32                    imageSize;
  2813.     MF3DErr                        result;
  2814.  
  2815.     result = kMF3DNoErr;
  2816.  
  2817.     MF3D_Allocate(returnObj);
  2818.  
  2819.     if (result == kMF3DNoErr)
  2820.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->width);
  2821.  
  2822.     if (result == kMF3DNoErr)
  2823.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->height);
  2824.  
  2825.     if (result == kMF3DNoErr)
  2826.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->rowBytes);
  2827.  
  2828.     if (result == kMF3DNoErr)
  2829.     {    imageSize = returnObj->height * returnObj->rowBytes;
  2830.  
  2831.         returnObj->image = MF3D_Malloc(imageSize);
  2832.         if (returnObj->image == NULL)
  2833.             result = kMF3DErrOutOfMemory;
  2834.     }
  2835.  
  2836.     if (result == kMF3DNoErr)
  2837.     {    result = MF3D_RawDataRead(inMetafilePtr, imageSize, returnObj->image);
  2838.         if (result != kMF3DNoErr)
  2839.             MF3D_Free(returnObj->image);
  2840.     }
  2841.  
  2842.     if (result == kMF3DNoErr)
  2843.         *outObj = (MF3DVoidObjPtr) returnObj;
  2844.     else
  2845.         MF3D_Free(returnObj);
  2846.  
  2847.     return result;
  2848. }
  2849.  
  2850. /*==============================================================================
  2851.  *    MF3D_ObjImageMaskWriter
  2852.  *==============================================================================
  2853.  */
  2854. MF3DErr
  2855. MF3D_ObjImageMaskWriter(
  2856.     MF3D_FilePtr    inMetafilePtr,
  2857.     MF3DVoidObjPtr    inObj)
  2858. {
  2859.     MF3DImageMaskObjPtr            writeObj;
  2860.     MF3DUns32                    imageSize;
  2861.     MF3DErr                        result;
  2862.  
  2863.     MF3D_VerifyObjectType(inObj, kMF3DObjImageMask);
  2864.     writeObj = (MF3DImageMaskObjPtr)inObj;
  2865.  
  2866.     MF3D_WriteNewLine(inMetafilePtr);
  2867.     result = MF3D_Uns32Write(inMetafilePtr, writeObj->width);
  2868.  
  2869.     if (result == kMF3DNoErr)
  2870.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->height);
  2871.  
  2872.     if (result == kMF3DNoErr)
  2873.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->rowBytes);
  2874.  
  2875.     if (result == kMF3DNoErr)
  2876.     {    imageSize = writeObj->height * writeObj->rowBytes;
  2877.         result = MF3D_RawDataWrite(inMetafilePtr, imageSize, writeObj->image);
  2878.     }
  2879.  
  2880.     return result;
  2881. }
  2882.  
  2883. /*==============================================================================
  2884.  *    MF3D_ObjImageMaskDisposer
  2885.  *==============================================================================
  2886.  */
  2887. MF3DErr
  2888. MF3D_ObjImageMaskDisposer(
  2889.     MF3DVoidObjPtr    inObj)
  2890. {
  2891.     MF3D_VerifyObjectType(inObj, kMF3DObjImageMask);
  2892.  
  2893.     if (inObj != NULL)
  2894.     {    MF3D_Free(((MF3DImageMaskObjPtr)inObj)->image);
  2895.         MF3D_Free(inObj);
  2896.     }
  2897.     return kMF3DNoErr;
  2898. }
  2899.  
  2900.  
  2901. #if defined(applec) || defined(__MWERKS__) || defined(THINK_C)
  2902. #pragma segment __MFOBJECT2__
  2903. #endif
  2904.  
  2905.  
  2906. /*==============================================================================
  2907.  *    MF3D_ObjAmbientCoefficientReader
  2908.  *==============================================================================
  2909.  */
  2910. MF3DErr
  2911. MF3D_ObjAmbientCoefficientReader(
  2912.     MF3D_FilePtr    inMetafilePtr,
  2913.     MF3DVoidObjPtr    *outObj)
  2914. {
  2915.     MF3DAmbientCoefficientObjPtr    returnObj;
  2916.     MF3DErr                        result;
  2917.  
  2918.     result = kMF3DNoErr;
  2919.  
  2920.     MF3D_Allocate(returnObj);
  2921.  
  2922.     if (result == kMF3DNoErr)
  2923.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->ambientCoefficent);
  2924.  
  2925.     if (result == kMF3DNoErr)
  2926.         *outObj = (MF3DVoidObjPtr) returnObj;
  2927.     else
  2928.         MF3D_Free(returnObj);
  2929.  
  2930.     return result;
  2931. }
  2932.  
  2933. /*==============================================================================
  2934.  *    MF3D_ObjAmbientCoefficientWriter
  2935.  *==============================================================================
  2936.  */
  2937. MF3DErr
  2938. MF3D_ObjAmbientCoefficientWriter(
  2939.     MF3D_FilePtr    inMetafilePtr,
  2940.     MF3DVoidObjPtr    inObj)
  2941. {
  2942.     MF3D_VerifyObjectType(inObj, kMF3DObjAmbientCoefficient);
  2943.  
  2944.     return MF3D_Float32Write(inMetafilePtr,
  2945.             ((MF3DAmbientCoefficientObjPtr)inObj)->ambientCoefficent);
  2946.  
  2947. }
  2948.  
  2949. /*==============================================================================
  2950.  *    MF3D_ObjAmbientCoefficientDisposer
  2951.  *==============================================================================
  2952.  */
  2953. MF3DErr
  2954. MF3D_ObjAmbientCoefficientDisposer(
  2955.     MF3DVoidObjPtr    inObj)
  2956. {
  2957.     MF3D_VerifyObjectType(inObj, kMF3DObjAmbientCoefficient);
  2958.  
  2959.     MF3D_Free(inObj);
  2960.     return kMF3DNoErr;
  2961. }
  2962.  
  2963. /*==============================================================================
  2964.  *    MF3D_ObjDiffuseColorReader
  2965.  *==============================================================================
  2966.  */
  2967. MF3DErr
  2968. MF3D_ObjDiffuseColorReader(
  2969.     MF3D_FilePtr    inMetafilePtr,
  2970.     MF3DVoidObjPtr    *outObj)
  2971. {
  2972.     MF3DDiffuseColorObjPtr        returnObj;
  2973.     MF3DErr                        result;
  2974.  
  2975.     result = kMF3DNoErr;
  2976.  
  2977.     MF3D_Allocate(returnObj);
  2978.  
  2979.     if (result == kMF3DNoErr)
  2980.         result = MF3D_RGBColorRead(inMetafilePtr, &returnObj->diffuseColor);
  2981.  
  2982.     if (result == kMF3DNoErr)
  2983.         *outObj = (MF3DVoidObjPtr) returnObj;
  2984.     else
  2985.         MF3D_Free(returnObj);
  2986.  
  2987.     return result;
  2988. }
  2989.  
  2990. /*==============================================================================
  2991.  *    MF3D_ObjDiffuseColorWriter
  2992.  *==============================================================================
  2993.  */
  2994. MF3DErr
  2995. MF3D_ObjDiffuseColorWriter(
  2996.     MF3D_FilePtr    inMetafilePtr,
  2997.     MF3DVoidObjPtr    inObj)
  2998. {
  2999.     MF3D_VerifyObjectType(inObj, kMF3DObjDiffuseColor);
  3000.     return MF3D_RGBColorWrite(inMetafilePtr,
  3001.             ((MF3DDiffuseColorObjPtr)inObj)->diffuseColor);
  3002. }
  3003.  
  3004. /*==============================================================================
  3005.  *    MF3D_ObjDiffuseColorDisposer
  3006.  *==============================================================================
  3007.  */
  3008. MF3DErr
  3009. MF3D_ObjDiffuseColorDisposer(
  3010.     MF3DVoidObjPtr    inObj)
  3011. {
  3012.     MF3D_VerifyObjectType(inObj, kMF3DObjDiffuseColor);
  3013.  
  3014.     MF3D_Free(inObj);
  3015.     return kMF3DNoErr;
  3016. }
  3017.  
  3018. /*==============================================================================
  3019.  *    MF3D_ObjHighlightStateReader
  3020.  *==============================================================================
  3021.  */
  3022. MF3DErr
  3023. MF3D_ObjHighlightStateReader(
  3024.     MF3D_FilePtr    inMetafilePtr,
  3025.     MF3DVoidObjPtr    *outObj)
  3026. {
  3027.     MF3DHighlightStateObjPtr    returnObj;
  3028.     MF3DErr                        result;
  3029.  
  3030.     result = kMF3DNoErr;
  3031.  
  3032.     MF3D_Allocate(returnObj);
  3033.  
  3034.     if (result == kMF3DNoErr)
  3035.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->highlighted);
  3036.  
  3037.     if (result == kMF3DNoErr)
  3038.         *outObj = (MF3DVoidObjPtr) returnObj;
  3039.     else
  3040.         MF3D_Free(returnObj);
  3041.  
  3042.     return result;
  3043. }
  3044.  
  3045. /*==============================================================================
  3046.  *    MF3D_ObjHighlightStateWriter
  3047.  *==============================================================================
  3048.  */
  3049. MF3DErr
  3050. MF3D_ObjHighlightStateWriter(
  3051.     MF3D_FilePtr    inMetafilePtr,
  3052.     MF3DVoidObjPtr    inObj)
  3053. {
  3054.     MF3D_VerifyObjectType(inObj, kMF3DObjHighlightState);
  3055.     return MF3D_BooleanWrite(inMetafilePtr,
  3056.             ((MF3DHighlightStateObjPtr)inObj)->highlighted);
  3057.  
  3058. }
  3059.  
  3060. /*==============================================================================
  3061.  *    MF3D_ObjHighlightStateDisposer
  3062.  *==============================================================================
  3063.  */
  3064. MF3DErr
  3065. MF3D_ObjHighlightStateDisposer(
  3066.     MF3DVoidObjPtr    inObj)
  3067. {
  3068.     MF3D_VerifyObjectType(inObj, kMF3DObjHighlightState);
  3069.  
  3070.     MF3D_Free(inObj);
  3071.     return kMF3DNoErr;
  3072. }
  3073.  
  3074. /*==============================================================================
  3075.  *    MF3D_ObjNormalReader
  3076.  *==============================================================================
  3077.  */
  3078. MF3DErr
  3079. MF3D_ObjNormalReader(
  3080.     MF3D_FilePtr    inMetafilePtr,
  3081.     MF3DVoidObjPtr    *outObj)
  3082. {
  3083.     MF3DNormalObjPtr            returnObj;
  3084.     MF3DErr                        result;
  3085.  
  3086.     result = kMF3DNoErr;
  3087.  
  3088.     MF3D_Allocate(returnObj);
  3089.  
  3090.     if (result == kMF3DNoErr)
  3091.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->normal);
  3092.  
  3093.     if (result == kMF3DNoErr)
  3094.         *outObj = (MF3DVoidObjPtr) returnObj;
  3095.     else
  3096.         MF3D_Free(returnObj);
  3097.  
  3098.     return result;
  3099. }
  3100.  
  3101. /*==============================================================================
  3102.  *    MF3D_ObjNormalWriter
  3103.  *==============================================================================
  3104.  */
  3105. MF3DErr
  3106. MF3D_ObjNormalWriter(
  3107.     MF3D_FilePtr    inMetafilePtr,
  3108.     MF3DVoidObjPtr    inObj)
  3109. {
  3110.     MF3D_VerifyObjectType(inObj, kMF3DObjNormal);
  3111.     return MF3D_Vector3DWrite(inMetafilePtr, ((MF3DNormalObjPtr)inObj)->normal);
  3112. }
  3113.  
  3114. /*==============================================================================
  3115.  *    MF3D_ObjNormalDisposer
  3116.  *==============================================================================
  3117.  */
  3118. MF3DErr
  3119. MF3D_ObjNormalDisposer(
  3120.     MF3DVoidObjPtr    inObj)
  3121. {
  3122.     MF3D_VerifyObjectType(inObj, kMF3DObjNormal);
  3123.  
  3124.     MF3D_Free(inObj);
  3125.     return kMF3DNoErr;
  3126. }
  3127.  
  3128. /*==============================================================================
  3129.  *    MF3D_ObjShadingUVReader
  3130.  *==============================================================================
  3131.  */
  3132. MF3DErr
  3133. MF3D_ObjShadingUVReader(
  3134.     MF3D_FilePtr    inMetafilePtr,
  3135.     MF3DVoidObjPtr    *outObj)
  3136. {
  3137.     MF3DShadingUVObjPtr            returnObj;
  3138.     MF3DErr                        result;
  3139.  
  3140.     result = kMF3DNoErr;
  3141.  
  3142.     MF3D_Allocate(returnObj);
  3143.  
  3144.     if (result == kMF3DNoErr)
  3145.         result = MF3D_Param2DRead(inMetafilePtr, &returnObj->shadingUV);
  3146.  
  3147.     if (result == kMF3DNoErr)
  3148.         *outObj = (MF3DVoidObjPtr) returnObj;
  3149.     else
  3150.         MF3D_Free(returnObj);
  3151.  
  3152.     return result;
  3153. }
  3154.  
  3155. /*==============================================================================
  3156.  *    MF3D_ObjShadingUVWriter
  3157.  *==============================================================================
  3158.  */
  3159. MF3DErr
  3160. MF3D_ObjShadingUVWriter(
  3161.     MF3D_FilePtr    inMetafilePtr,
  3162.     MF3DVoidObjPtr    inObj)
  3163. {
  3164.     MF3D_VerifyObjectType(inObj, kMF3DObjShadingUV);
  3165.     return MF3D_Param2DWrite(inMetafilePtr,
  3166.             ((MF3DShadingUVObjPtr)inObj)->shadingUV);
  3167. }
  3168.  
  3169. /*==============================================================================
  3170.  *    MF3D_ObjShadingUVDisposer
  3171.  *==============================================================================
  3172.  */
  3173. MF3DErr
  3174. MF3D_ObjShadingUVDisposer(
  3175.     MF3DVoidObjPtr    inObj)
  3176. {
  3177.     MF3D_VerifyObjectType(inObj, kMF3DObjShadingUV);
  3178.  
  3179.     MF3D_Free(inObj);
  3180.     return kMF3DNoErr;
  3181. }
  3182.  
  3183. /*==============================================================================
  3184.  *    MF3D_ObjSpecularColorReader
  3185.  *==============================================================================
  3186.  */
  3187. MF3DErr
  3188. MF3D_ObjSpecularColorReader(
  3189.     MF3D_FilePtr    inMetafilePtr,
  3190.     MF3DVoidObjPtr    *outObj)
  3191. {
  3192.     MF3DSpecularColorObjPtr        returnObj;
  3193.     MF3DErr                        result;
  3194.  
  3195.     result = kMF3DNoErr;
  3196.  
  3197.     MF3D_Allocate(returnObj);
  3198.  
  3199.     if (result == kMF3DNoErr)
  3200.         result = MF3D_RGBColorRead(inMetafilePtr, &returnObj->specularColor);
  3201.  
  3202.     if (result == kMF3DNoErr)
  3203.         *outObj = (MF3DVoidObjPtr) returnObj;
  3204.     else
  3205.         MF3D_Free(returnObj);
  3206.  
  3207.     return result;
  3208. }
  3209.  
  3210. /*==============================================================================
  3211.  *    MF3D_ObjSpecularColorWriter
  3212.  *==============================================================================
  3213.  */
  3214. MF3DErr
  3215. MF3D_ObjSpecularColorWriter(
  3216.     MF3D_FilePtr    inMetafilePtr,
  3217.     MF3DVoidObjPtr    inObj)
  3218. {
  3219.     MF3D_VerifyObjectType(inObj, kMF3DObjSpecularColor);
  3220.     return MF3D_RGBColorWrite(inMetafilePtr,
  3221.             ((MF3DSpecularColorObjPtr)inObj)->specularColor);
  3222. }
  3223.  
  3224. /*==============================================================================
  3225.  *    MF3D_ObjSpecularColorDisposer
  3226.  *==============================================================================
  3227.  */
  3228. MF3DErr
  3229. MF3D_ObjSpecularColorDisposer(
  3230.     MF3DVoidObjPtr    inObj)
  3231. {
  3232.     MF3D_VerifyObjectType(inObj, kMF3DObjSpecularColor);
  3233.  
  3234.     MF3D_Free(inObj);
  3235.     return kMF3DNoErr;
  3236. }
  3237.  
  3238. /*==============================================================================
  3239.  *    MF3D_ObjSpecularControlReader
  3240.  *==============================================================================
  3241.  */
  3242. MF3DErr
  3243. MF3D_ObjSpecularControlReader(
  3244.     MF3D_FilePtr    inMetafilePtr,
  3245.     MF3DVoidObjPtr    *outObj)
  3246. {
  3247.     MF3DSpecularControlObjPtr    returnObj;
  3248.     MF3DErr                        result;
  3249.  
  3250.     result = kMF3DNoErr;
  3251.  
  3252.     MF3D_Allocate(returnObj);
  3253.  
  3254.     if (result == kMF3DNoErr)
  3255.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->specularControl);
  3256.  
  3257.     if (result == kMF3DNoErr)
  3258.         *outObj = (MF3DVoidObjPtr) returnObj;
  3259.     else
  3260.         MF3D_Free(returnObj);
  3261.  
  3262.     return result;
  3263. }
  3264.  
  3265. /*==============================================================================
  3266.  *    MF3D_ObjSpecularControlWriter
  3267.  *==============================================================================
  3268.  */
  3269. MF3DErr
  3270. MF3D_ObjSpecularControlWriter(
  3271.     MF3D_FilePtr    inMetafilePtr,
  3272.     MF3DVoidObjPtr    inObj)
  3273. {
  3274.     MF3D_VerifyObjectType(inObj, kMF3DObjSpecularControl);
  3275.     return MF3D_Float32Write(inMetafilePtr,
  3276.             ((MF3DSpecularControlObjPtr)inObj)->specularControl);
  3277. }
  3278.  
  3279. /*==============================================================================
  3280.  *    MF3D_ObjSpecularControlDisposer
  3281.  *==============================================================================
  3282.  */
  3283. MF3DErr
  3284. MF3D_ObjSpecularControlDisposer(
  3285.     MF3DVoidObjPtr    inObj)
  3286. {
  3287.     MF3D_VerifyObjectType(inObj, kMF3DObjSpecularControl);
  3288.  
  3289.     MF3D_Free(inObj);
  3290.     return kMF3DNoErr;
  3291. }
  3292.  
  3293. /*==============================================================================
  3294.  *    MF3D_ObjSurfaceTangentReader
  3295.  *==============================================================================
  3296.  */
  3297. MF3DErr
  3298. MF3D_ObjSurfaceTangentReader(
  3299.     MF3D_FilePtr    inMetafilePtr,
  3300.     MF3DVoidObjPtr    *outObj)
  3301. {
  3302.     MF3DSurfaceTangentObjPtr    returnObj;
  3303.     MF3DErr                        result;
  3304.  
  3305.     result = kMF3DNoErr;
  3306.  
  3307.     MF3D_Allocate(returnObj);
  3308.  
  3309.     if (result == kMF3DNoErr)
  3310.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->paramU);
  3311.  
  3312.     if (result == kMF3DNoErr)
  3313.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->paramV);
  3314.  
  3315.     if (result == kMF3DNoErr)
  3316.         *outObj = (MF3DVoidObjPtr) returnObj;
  3317.     else
  3318.         MF3D_Free(returnObj);
  3319.  
  3320.     return result;
  3321. }
  3322.  
  3323. /*==============================================================================
  3324.  *    MF3D_ObjSurfaceTangentWriter
  3325.  *==============================================================================
  3326.  */
  3327. MF3DErr
  3328. MF3D_ObjSurfaceTangentWriter(
  3329.     MF3D_FilePtr    inMetafilePtr,
  3330.     MF3DVoidObjPtr    inObj)
  3331. {
  3332.     MF3DSurfaceTangentObjPtr    writeObj;
  3333.     MF3DErr                        result;
  3334.     
  3335.     MF3D_VerifyObjectType(inObj, kMF3DObjSurfaceTangent);
  3336.     writeObj = (MF3DSurfaceTangentObjPtr)inObj;
  3337.  
  3338.     result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->paramU);
  3339.  
  3340.     if (result == kMF3DNoErr)
  3341.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->paramV);
  3342.  
  3343.     return result;
  3344. }
  3345.  
  3346. /*==============================================================================
  3347.  *    MF3D_ObjSurfaceTangentDisposer
  3348.  *==============================================================================
  3349.  */
  3350. MF3DErr
  3351. MF3D_ObjSurfaceTangentDisposer(
  3352.     MF3DVoidObjPtr    inObj)
  3353. {
  3354.     MF3D_VerifyObjectType(inObj, kMF3DObjSurfaceTangent);
  3355.  
  3356.     MF3D_Free(inObj);
  3357.     return kMF3DNoErr;
  3358. }
  3359.  
  3360. /*==============================================================================
  3361.  *    MF3D_ObjSurfaceUVReader
  3362.  *==============================================================================
  3363.  */
  3364. MF3DErr
  3365. MF3D_ObjSurfaceUVReader(
  3366.     MF3D_FilePtr    inMetafilePtr,
  3367.     MF3DVoidObjPtr    *outObj)
  3368. {
  3369.     MF3DSurfaceUVObjPtr            returnObj;
  3370.     MF3DErr                        result;
  3371.  
  3372.     result = kMF3DNoErr;
  3373.  
  3374.     MF3D_Allocate(returnObj);
  3375.  
  3376.     if (result == kMF3DNoErr)
  3377.         result = MF3D_Param2DRead(inMetafilePtr, &returnObj->surfaceUV);
  3378.  
  3379.     if (result == kMF3DNoErr)
  3380.         *outObj = (MF3DVoidObjPtr) returnObj;
  3381.     else
  3382.         MF3D_Free(returnObj);
  3383.  
  3384.     return result;
  3385. }
  3386.  
  3387. /*==============================================================================
  3388.  *    MF3D_ObjSurfaceUVWriter
  3389.  *==============================================================================
  3390.  */
  3391. MF3DErr
  3392. MF3D_ObjSurfaceUVWriter(
  3393.     MF3D_FilePtr    inMetafilePtr,
  3394.     MF3DVoidObjPtr    inObj)
  3395. {
  3396.     MF3D_VerifyObjectType(inObj, kMF3DObjSurfaceUV);
  3397.     return MF3D_Param2DWrite(inMetafilePtr,
  3398.             ((MF3DSurfaceUVObjPtr)inObj)->surfaceUV);
  3399. }
  3400.  
  3401. /*==============================================================================
  3402.  *    MF3D_ObjSurfaceUVDisposer
  3403.  *==============================================================================
  3404.  */
  3405. MF3DErr
  3406. MF3D_ObjSurfaceUVDisposer(
  3407.     MF3DVoidObjPtr    inObj)
  3408. {
  3409.     MF3D_VerifyObjectType(inObj, kMF3DObjSurfaceUV);
  3410.  
  3411.     MF3D_Free(inObj);
  3412.     return kMF3DNoErr;
  3413. }
  3414.  
  3415. /*==============================================================================
  3416.  *    MF3D_ObjTransparencyColorReader
  3417.  *==============================================================================
  3418.  */
  3419. MF3DErr
  3420. MF3D_ObjTransparencyColorReader(
  3421.     MF3D_FilePtr    inMetafilePtr,
  3422.     MF3DVoidObjPtr    *outObj)
  3423. {
  3424.     MF3DTransparencyColorObjPtr    returnObj;
  3425.     MF3DErr                        result;
  3426.  
  3427.     result = kMF3DNoErr;
  3428.  
  3429.     MF3D_Allocate(returnObj);
  3430.  
  3431.     if (result == kMF3DNoErr)
  3432.         result = MF3D_RGBColorRead(inMetafilePtr, &returnObj->transparency);
  3433.  
  3434.     if (result == kMF3DNoErr)
  3435.         *outObj = (MF3DVoidObjPtr) returnObj;
  3436.     else
  3437.         MF3D_Free(returnObj);
  3438.  
  3439.     return result;
  3440. }
  3441.  
  3442. /*==============================================================================
  3443.  *    MF3D_ObjTransparencyColorWriter
  3444.  *==============================================================================
  3445.  */
  3446. MF3DErr
  3447. MF3D_ObjTransparencyColorWriter(
  3448.     MF3D_FilePtr    inMetafilePtr,
  3449.     MF3DVoidObjPtr    inObj)
  3450. {
  3451.     MF3D_VerifyObjectType(inObj, kMF3DObjTransparencyColor);
  3452.     return MF3D_RGBColorWrite(inMetafilePtr,
  3453.             ((MF3DTransparencyColorObjPtr)inObj)->transparency);
  3454. }
  3455.  
  3456. /*==============================================================================
  3457.  *    MF3D_ObjTransparencyColorDisposer
  3458.  *==============================================================================
  3459.  */
  3460. MF3DErr
  3461. MF3D_ObjTransparencyColorDisposer(
  3462.     MF3DVoidObjPtr    inObj)
  3463. {
  3464.     MF3D_VerifyObjectType(inObj, kMF3DObjTransparencyColor);
  3465.  
  3466.     MF3D_Free(inObj);
  3467.     return kMF3DNoErr;
  3468. }
  3469.  
  3470. /*==============================================================================
  3471.  *    MF3D_ObjRendererInteractiveReader
  3472.  *==============================================================================
  3473.  */
  3474. MF3DErr
  3475. MF3D_ObjRendererInteractiveReader(
  3476.     MF3D_FilePtr    inMetafilePtr,
  3477.     MF3DVoidObjPtr    *outObj)
  3478. {
  3479.     MF3DInteractiveRendererObjPtr    returnObj;
  3480.     MF3DErr                            result;
  3481.  
  3482.     MF3D_Unused(inMetafilePtr);
  3483.     result = kMF3DNoErr;
  3484.  
  3485.     MF3D_Allocate(returnObj);
  3486.  
  3487.     if (result == kMF3DNoErr)
  3488.         *outObj = (MF3DVoidObjPtr) returnObj;
  3489.     else
  3490.         MF3D_Free(returnObj);
  3491.  
  3492.     return result;
  3493. }
  3494.  
  3495. /*==============================================================================
  3496.  *    MF3D_ObjRendererInteractiveWriter
  3497.  *==============================================================================
  3498.  */
  3499. MF3DErr
  3500. MF3D_ObjRendererInteractiveWriter(
  3501.     MF3D_FilePtr    inMetafilePtr,
  3502.     MF3DVoidObjPtr    inObj)
  3503. {
  3504.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererInteractive);
  3505.     MF3D_Unused(inMetafilePtr);
  3506.     MF3D_Unused(inObj);
  3507.     /* Nothing to write! */
  3508.     return kMF3DNoErr;
  3509. }
  3510.  
  3511. /*==============================================================================
  3512.  *    MF3D_ObjRendererInteractiveDisposer
  3513.  *==============================================================================
  3514.  */
  3515. MF3DErr
  3516. MF3D_ObjRendererInteractiveDisposer(
  3517.     MF3DVoidObjPtr    inObj)
  3518. {
  3519.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererInteractive);
  3520.  
  3521.     MF3D_Free(inObj);
  3522.     return kMF3DNoErr;
  3523. }
  3524.  
  3525. /*==============================================================================
  3526.  *    MF3D_ObjRendererGenericReader
  3527.  *==============================================================================
  3528.  */
  3529. MF3DErr
  3530. MF3D_ObjRendererGenericReader(
  3531.     MF3D_FilePtr    inMetafilePtr,
  3532.     MF3DVoidObjPtr    *outObj)
  3533. {
  3534.     MF3DGenericRendererObjPtr    returnObj;
  3535.     MF3DErr                        result;
  3536.  
  3537.     MF3D_Unused(inMetafilePtr);
  3538.     result = kMF3DNoErr;
  3539.  
  3540.     MF3D_Allocate(returnObj);
  3541.  
  3542.     if (result == kMF3DNoErr)
  3543.         *outObj = (MF3DVoidObjPtr) returnObj;
  3544.     else
  3545.         MF3D_Free(returnObj);
  3546.  
  3547.     return result;
  3548. }
  3549.  
  3550. /*==============================================================================
  3551.  *    MF3D_ObjRendererGenericWriter
  3552.  *==============================================================================
  3553.  */
  3554. MF3DErr
  3555. MF3D_ObjRendererGenericWriter(
  3556.     MF3D_FilePtr    inMetafilePtr,
  3557.     MF3DVoidObjPtr    inObj)
  3558. {
  3559.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererGeneric);
  3560.     MF3D_Unused(inMetafilePtr);
  3561.     MF3D_Unused(inObj);
  3562.     /* Nothing to write! */
  3563.     return kMF3DNoErr;
  3564. }
  3565.  
  3566. /*==============================================================================
  3567.  *    MF3D_ObjRendererGenericDisposer
  3568.  *==============================================================================
  3569.  */
  3570. MF3DErr
  3571. MF3D_ObjRendererGenericDisposer(
  3572.     MF3DVoidObjPtr    inObj)
  3573. {
  3574.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererGeneric);
  3575.  
  3576.     MF3D_Free(inObj);
  3577.     return kMF3DNoErr;
  3578. }
  3579.  
  3580. /*==============================================================================
  3581.  *    MF3D_ObjRendererWireFrameReader
  3582.  *==============================================================================
  3583.  */
  3584. MF3DErr
  3585. MF3D_ObjRendererWireFrameReader(
  3586.     MF3D_FilePtr    inMetafilePtr,
  3587.     MF3DVoidObjPtr    *outObj)
  3588. {
  3589.     MF3DWireFrameObjPtr    returnObj;
  3590.     MF3DErr                        result;
  3591.  
  3592.     MF3D_Unused(inMetafilePtr);
  3593.     result = kMF3DNoErr;
  3594.  
  3595.     MF3D_Allocate(returnObj);
  3596.  
  3597.     if (result == kMF3DNoErr)
  3598.         *outObj = (MF3DVoidObjPtr) returnObj;
  3599.     else
  3600.         MF3D_Free(returnObj);
  3601.  
  3602.     return result;
  3603. }
  3604.  
  3605. /*==============================================================================
  3606.  *    MF3D_ObjRendererWireFrameWriter
  3607.  *==============================================================================
  3608.  */
  3609. MF3DErr
  3610. MF3D_ObjRendererWireFrameWriter(
  3611.     MF3D_FilePtr    inMetafilePtr,
  3612.     MF3DVoidObjPtr    inObj)
  3613. {
  3614.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererWireFrame);
  3615.     MF3D_Unused(inMetafilePtr);
  3616.     MF3D_Unused(inObj);
  3617.     /* Nothing to write! */
  3618.     return kMF3DNoErr;
  3619. }
  3620.  
  3621. /*==============================================================================
  3622.  *    MF3D_ObjRendererWireFrameDisposer
  3623.  *==============================================================================
  3624.  */
  3625. MF3DErr
  3626. MF3D_ObjRendererWireFrameDisposer(
  3627.     MF3DVoidObjPtr    inObj)
  3628. {
  3629.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererWireFrame);
  3630.  
  3631.     MF3D_Free(inObj);
  3632.     return kMF3DNoErr;
  3633. }
  3634.  
  3635. /*==============================================================================
  3636.  *    MF3D_ObjRendererZBufferReader
  3637.  *==============================================================================
  3638.  */
  3639. MF3DErr
  3640. MF3D_ObjRendererZBufferReader(
  3641.     MF3D_FilePtr    inMetafilePtr,
  3642.     MF3DVoidObjPtr    *outObj)
  3643. {
  3644.     MF3DZBufferObjPtr    returnObj;
  3645.     MF3DErr                        result;
  3646.  
  3647.     MF3D_Unused(inMetafilePtr);
  3648.     result = kMF3DNoErr;
  3649.  
  3650.     MF3D_Allocate(returnObj);
  3651.  
  3652.     if (result == kMF3DNoErr)
  3653.         *outObj = (MF3DVoidObjPtr) returnObj;
  3654.     else
  3655.         MF3D_Free(returnObj);
  3656.  
  3657.     return result;
  3658. }
  3659.  
  3660. /*==============================================================================
  3661.  *    MF3D_ObjRendererZBufferWriter
  3662.  *==============================================================================
  3663.  */
  3664. MF3DErr
  3665. MF3D_ObjRendererZBufferWriter(
  3666.     MF3D_FilePtr    inMetafilePtr,
  3667.     MF3DVoidObjPtr    inObj)
  3668. {
  3669.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererZBuffer);
  3670.     MF3D_Unused(inMetafilePtr);
  3671.     MF3D_Unused(inObj);
  3672.     /* Nothing to write! */
  3673.     return kMF3DNoErr;
  3674. }
  3675.  
  3676. /*==============================================================================
  3677.  *    MF3D_ObjRendererZBufferDisposer
  3678.  *==============================================================================
  3679.  */
  3680. MF3DErr
  3681. MF3D_ObjRendererZBufferDisposer(
  3682.     MF3DVoidObjPtr    inObj)
  3683. {
  3684.     MF3D_VerifyObjectType(inObj, kMF3DObjRendererZBuffer);
  3685.  
  3686.     MF3D_Free(inObj);
  3687.     return kMF3DNoErr;
  3688. }
  3689.  
  3690. /*==============================================================================
  3691.  *    MF3D_ObjAttributeSetReader
  3692.  *==============================================================================
  3693.  */
  3694. MF3DErr
  3695. MF3D_ObjAttributeSetReader(
  3696.     MF3D_FilePtr    inMetafilePtr,
  3697.     MF3DVoidObjPtr    *outObj)
  3698. {
  3699.     MF3DAttributeSetObjPtr        returnObj;
  3700.     MF3DErr                        result;
  3701.  
  3702.     MF3D_Unused(inMetafilePtr);
  3703.     result = kMF3DNoErr;
  3704.  
  3705.     MF3D_Allocate(returnObj);
  3706.  
  3707.     if (result == kMF3DNoErr)
  3708.         *outObj = (MF3DVoidObjPtr) returnObj;
  3709.     else
  3710.         MF3D_Free(returnObj);
  3711.  
  3712.     return result;
  3713. }
  3714.  
  3715.  
  3716. /*==============================================================================
  3717.  *    MF3D_ObjAttributeSetWriter
  3718.  *==============================================================================
  3719.  */
  3720. MF3DErr
  3721. MF3D_ObjAttributeSetWriter(
  3722.     MF3D_FilePtr    inMetafilePtr,
  3723.     MF3DVoidObjPtr    inObj)
  3724. {
  3725.     MF3D_VerifyObjectType(inObj, kMF3DObjAttributeSet);
  3726.     MF3D_Unused(inMetafilePtr);
  3727.     MF3D_Unused(inObj);
  3728.     /* Nothing to write! */
  3729.     return kMF3DNoErr;
  3730. }
  3731.  
  3732. /*==============================================================================
  3733.  *    MF3D_ObjAttributeSetDisposer
  3734.  *==============================================================================
  3735.  */
  3736. MF3DErr
  3737. MF3D_ObjAttributeSetDisposer(
  3738.     MF3DVoidObjPtr    inObj)
  3739. {
  3740.     MF3D_VerifyObjectType(inObj, kMF3DObjAttributeSet);
  3741.  
  3742.     MF3D_Free(inObj);
  3743.     return kMF3DNoErr;
  3744. }
  3745.  
  3746. /*==============================================================================
  3747.  *    MF3D_ObjOrthographicCameraReader
  3748.  *==============================================================================
  3749.  */
  3750. MF3DErr
  3751. MF3D_ObjOrthographicCameraReader(
  3752.     MF3D_FilePtr    inMetafilePtr,
  3753.     MF3DVoidObjPtr    *outObj)
  3754. {
  3755.     MF3DOrthographicCameraObjPtr    returnObj;
  3756.     MF3DErr                            result;
  3757.  
  3758.     result = kMF3DNoErr;
  3759.  
  3760.     MF3D_Allocate(returnObj);
  3761.  
  3762.     if (result == kMF3DNoErr)
  3763.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->left);
  3764.  
  3765.     if (result == kMF3DNoErr)
  3766.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->top);
  3767.  
  3768.     if (result == kMF3DNoErr)
  3769.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->right);
  3770.  
  3771.     if (result == kMF3DNoErr)
  3772.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->bottom);
  3773.  
  3774.     if (result == kMF3DNoErr)
  3775.         *outObj = (MF3DVoidObjPtr) returnObj;
  3776.     else
  3777.         MF3D_Free(returnObj);
  3778.  
  3779.     return result;
  3780. }
  3781.  
  3782.  
  3783. /*==============================================================================
  3784.  *    MF3D_ObjOrthographicCameraWriter
  3785.  *==============================================================================
  3786.  */
  3787. MF3DErr
  3788. MF3D_ObjOrthographicCameraWriter(
  3789.     MF3D_FilePtr    inMetafilePtr,
  3790.     MF3DVoidObjPtr    inObj)
  3791. {
  3792.     MF3DOrthographicCameraObjPtr    writeObj;
  3793.     MF3DErr                            result;
  3794.  
  3795.     MF3D_VerifyObjectType(inObj, kMF3DObjOrthographicCamera);
  3796.     writeObj = (MF3DOrthographicCameraObjPtr)inObj;
  3797.  
  3798.     result = MF3D_Float32Write(inMetafilePtr, writeObj->left);
  3799.  
  3800.     if (result == kMF3DNoErr)
  3801.         result = MF3D_Float32Write(inMetafilePtr, writeObj->top);
  3802.  
  3803.     if (result == kMF3DNoErr)
  3804.         result = MF3D_Float32Write(inMetafilePtr, writeObj->right);
  3805.  
  3806.     if (result == kMF3DNoErr)
  3807.         result = MF3D_Float32Write(inMetafilePtr, writeObj->bottom);
  3808.  
  3809.     return result;
  3810. }
  3811.  
  3812. /*==============================================================================
  3813.  *    MF3D_ObjOrthographicCameraDisposer
  3814.  *==============================================================================
  3815.  */
  3816. MF3DErr
  3817. MF3D_ObjOrthographicCameraDisposer(
  3818.     MF3DVoidObjPtr    inObj)
  3819. {
  3820.     MF3D_VerifyObjectType(inObj, kMF3DObjOrthographicCamera);
  3821.  
  3822.     MF3D_Free(inObj);
  3823.     return kMF3DNoErr;
  3824. }
  3825.  
  3826. /*==============================================================================
  3827.  *    MF3D_ObjViewAngleAspectCameraReader
  3828.  *==============================================================================
  3829.  */
  3830. MF3DErr
  3831. MF3D_ObjViewAngleAspectCameraReader(
  3832.     MF3D_FilePtr    inMetafilePtr,
  3833.     MF3DVoidObjPtr    *outObj)
  3834. {
  3835.     MF3DViewAngleAspectCameraObjPtr    returnObj;
  3836.     MF3DErr                            result;
  3837.  
  3838.     result = kMF3DNoErr;
  3839.  
  3840.     MF3D_Allocate(returnObj);
  3841.  
  3842.     if (result == kMF3DNoErr)
  3843.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->fieldOfView);
  3844.  
  3845.     if (result == kMF3DNoErr)
  3846.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->aspectRatioXtoY);
  3847.  
  3848.     if (result == kMF3DNoErr)
  3849.         *outObj = (MF3DVoidObjPtr) returnObj;
  3850.     else
  3851.         MF3D_Free(returnObj);
  3852.  
  3853.     return result;
  3854. }
  3855.  
  3856.  
  3857. /*==============================================================================
  3858.  *    MF3D_ObjViewAngleAspectCameraWriter
  3859.  *==============================================================================
  3860.  */
  3861. MF3DErr
  3862. MF3D_ObjViewAngleAspectCameraWriter(
  3863.     MF3D_FilePtr    inMetafilePtr,
  3864.     MF3DVoidObjPtr    inObj)
  3865. {
  3866.     MF3DViewAngleAspectCameraObjPtr    writeObj;
  3867.     MF3DErr                            result;
  3868.  
  3869.     MF3D_VerifyObjectType(inObj, kMF3DObjViewAngleAspectCamera);
  3870.     writeObj = (MF3DViewAngleAspectCameraObjPtr)inObj;
  3871.  
  3872.     result = MF3D_Float32Write(inMetafilePtr, writeObj->fieldOfView);
  3873.  
  3874.     if (result == kMF3DNoErr)
  3875.         result = MF3D_Float32Write(inMetafilePtr, writeObj->aspectRatioXtoY);
  3876.  
  3877.     return result;
  3878. }
  3879.  
  3880. /*==============================================================================
  3881.  *    MF3D_ObjViewAngleAspectCameraDisposer
  3882.  *==============================================================================
  3883.  */
  3884. MF3DErr
  3885. MF3D_ObjViewAngleAspectCameraDisposer(
  3886.     MF3DVoidObjPtr    inObj)
  3887. {
  3888.     MF3D_VerifyObjectType(inObj, kMF3DObjViewAngleAspectCamera);
  3889.  
  3890.     MF3D_Free(inObj);
  3891.     return kMF3DNoErr;
  3892. }
  3893.  
  3894. /*==============================================================================
  3895.  *    MF3D_ObjViewPlaneCameraReader
  3896.  *==============================================================================
  3897.  */
  3898. MF3DErr
  3899. MF3D_ObjViewPlaneCameraReader(
  3900.     MF3D_FilePtr    inMetafilePtr,
  3901.     MF3DVoidObjPtr    *outObj)
  3902. {
  3903.     MF3DViewPlaneCameraObjPtr    returnObj;
  3904.     MF3DErr                        result;
  3905.  
  3906.     result = kMF3DNoErr;
  3907.  
  3908.     MF3D_Allocate(returnObj);
  3909.  
  3910.     if (result == kMF3DNoErr)
  3911.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->viewPlane);
  3912.  
  3913.     if (result == kMF3DNoErr)
  3914.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->halfWidthAtViewPlane);
  3915.  
  3916.     if (result == kMF3DNoErr)
  3917.     {    result = MF3D_Float32Read(inMetafilePtr,
  3918.                 &returnObj->halfHeightAtViewPlane);
  3919.     }
  3920.  
  3921.     if (result == kMF3DNoErr)
  3922.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->centerXOnViewPlane);
  3923.  
  3924.     if (result == kMF3DNoErr)
  3925.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->centerYOnViewPlane);
  3926.  
  3927.     if (result == kMF3DNoErr)
  3928.         *outObj = (MF3DVoidObjPtr) returnObj;
  3929.     else
  3930.         MF3D_Free(returnObj);
  3931.  
  3932.     return result;
  3933. }
  3934.  
  3935.  
  3936. /*==============================================================================
  3937.  *    MF3D_ObjViewPlaneCameraWriter
  3938.  *==============================================================================
  3939.  */
  3940. MF3DErr
  3941. MF3D_ObjViewPlaneCameraWriter(
  3942.     MF3D_FilePtr    inMetafilePtr,
  3943.     MF3DVoidObjPtr    inObj)
  3944. {
  3945.     MF3DViewPlaneCameraObjPtr    writeObj;
  3946.     MF3DErr                        result;
  3947.  
  3948.     MF3D_VerifyObjectType(inObj, kMF3DObjViewPlaneCamera);
  3949.     writeObj = (MF3DViewPlaneCameraObjPtr)inObj;
  3950.  
  3951.     result = MF3D_Float32Write(inMetafilePtr, writeObj->viewPlane);
  3952.  
  3953.     if (result == kMF3DNoErr)
  3954.     {    result = MF3D_Float32Write(inMetafilePtr,
  3955.                 writeObj->halfWidthAtViewPlane);
  3956.     }
  3957.  
  3958.     if (result == kMF3DNoErr)
  3959.     {    result = MF3D_Float32Write(inMetafilePtr,
  3960.                 writeObj->halfHeightAtViewPlane);
  3961.     }
  3962.  
  3963.     if (result == kMF3DNoErr)
  3964.         result = MF3D_Float32Write(inMetafilePtr, writeObj->centerXOnViewPlane);
  3965.  
  3966.     if (result == kMF3DNoErr)
  3967.         result = MF3D_Float32Write(inMetafilePtr, writeObj->centerYOnViewPlane);
  3968.  
  3969.     return result;
  3970. }
  3971.  
  3972. /*==============================================================================
  3973.  *    MF3D_ObjViewPlaneCameraDisposer
  3974.  *==============================================================================
  3975.  */
  3976. MF3DErr
  3977. MF3D_ObjViewPlaneCameraDisposer(
  3978.     MF3DVoidObjPtr    inObj)
  3979. {
  3980.     MF3D_VerifyObjectType(inObj, kMF3DObjViewPlaneCamera);
  3981.  
  3982.     MF3D_Free(inObj);
  3983.     return kMF3DNoErr;
  3984. }
  3985.  
  3986. /*==============================================================================
  3987.  *    MF3D_ObjBoxReader
  3988.  *==============================================================================
  3989.  */
  3990. MF3DErr
  3991. MF3D_ObjBoxReader(
  3992.     MF3D_FilePtr    inMetafilePtr,
  3993.     MF3DVoidObjPtr    *outObj)
  3994. {
  3995.     MF3DBoxObjPtr            returnObj;
  3996.     MF3DVector3D            vector;
  3997.     MF3DErr                    numberExists;
  3998.     MF3DErr                    result;
  3999.  
  4000.     result = kMF3DNoErr;
  4001.  
  4002.     MF3D_Allocate(returnObj);
  4003.  
  4004.     if (result == kMF3DNoErr)
  4005.     {    returnObj->box = NULL;
  4006.  
  4007.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4008.     }
  4009.  
  4010.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4011.     {    MF3D_Allocate(returnObj->box);
  4012.  
  4013.         returnObj->box->orientation.x = vector.x;
  4014.         returnObj->box->orientation.y = vector.y;
  4015.         returnObj->box->orientation.z = vector.z;
  4016.  
  4017.         if (result == kMF3DNoErr)
  4018.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4019.                     &returnObj->box->majorAxis);
  4020.         }
  4021.  
  4022.         if (result == kMF3DNoErr)
  4023.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4024.                     &returnObj->box->minorAxis);
  4025.         }
  4026.  
  4027.         if (result == kMF3DNoErr)
  4028.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->box->origin);
  4029.     }
  4030.  
  4031.     if (result == kMF3DNoErr)
  4032.         *outObj = (MF3DVoidObjPtr) returnObj;
  4033.     else
  4034.         MF3D_Free(returnObj);
  4035.  
  4036.     return result;
  4037. }
  4038.  
  4039.  
  4040. /*==============================================================================
  4041.  *    MF3D_ObjBoxWriter
  4042.  *==============================================================================
  4043.  */
  4044. MF3DErr
  4045. MF3D_ObjBoxWriter(
  4046.     MF3D_FilePtr    inMetafilePtr,
  4047.     MF3DVoidObjPtr    inObj)
  4048. {
  4049.     MF3DBoxObjPtr            writeObj;
  4050.     MF3DErr                    result;
  4051.  
  4052.     MF3D_VerifyObjectType(inObj, kMF3DObjBox);
  4053.     writeObj = (MF3DBoxObjPtr)inObj;
  4054.  
  4055.     result = kMF3DNoErr;
  4056.  
  4057.     if (writeObj->box != NULL)
  4058.     {    MF3D_WriteNewLine(inMetafilePtr);
  4059.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->box->orientation);
  4060.  
  4061.         if (result == kMF3DNoErr)
  4062.         {    MF3D_WriteNewLine(inMetafilePtr);
  4063.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4064.                     writeObj->box->majorAxis);
  4065.         }
  4066.  
  4067.         if (result == kMF3DNoErr)
  4068.         {    MF3D_WriteNewLine(inMetafilePtr);
  4069.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4070.                     writeObj->box->minorAxis);
  4071.         }
  4072.  
  4073.         if (result == kMF3DNoErr)
  4074.         {    MF3D_WriteNewLine(inMetafilePtr);
  4075.             result = MF3D_Point3DWrite(inMetafilePtr, writeObj->box->origin);
  4076.         }
  4077.  
  4078.         if (result == kMF3DNoErr)
  4079.             MF3D_WriteNewLine(inMetafilePtr);
  4080.     }
  4081.  
  4082.     return result;
  4083. }
  4084.  
  4085. /*==============================================================================
  4086.  *    MF3D_ObjBoxDisposer
  4087.  *==============================================================================
  4088.  */
  4089. MF3DErr
  4090. MF3D_ObjBoxDisposer(
  4091.     MF3DVoidObjPtr    inObj)
  4092. {
  4093.     MF3D_VerifyObjectType(inObj, kMF3DObjBox);
  4094.  
  4095.     if (inObj != NULL)
  4096.     {    if (((MF3DBoxObjPtr)inObj)->box != NULL)
  4097.         MF3D_Free(((MF3DBoxObjPtr)inObj)->box);
  4098.         MF3D_Free(inObj);
  4099.     }
  4100.  
  4101.     return kMF3DNoErr;
  4102. }
  4103.  
  4104. /*==============================================================================
  4105.  *    MF3D_ObjConeReader
  4106.  *==============================================================================
  4107.  */
  4108. MF3DErr
  4109. MF3D_ObjConeReader(
  4110.     MF3D_FilePtr    inMetafilePtr,
  4111.     MF3DVoidObjPtr    *outObj)
  4112. {
  4113.     MF3DConeObjPtr                returnObj;
  4114.     MF3DVector3D                vector;
  4115.     MF3DErr                        numberExists;
  4116.     MF3DErr                        result;
  4117.  
  4118.     result = kMF3DNoErr;
  4119.  
  4120.     MF3D_Allocate(returnObj);
  4121.  
  4122.     if (result == kMF3DNoErr)
  4123.     {    returnObj->cone = NULL;
  4124.  
  4125.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4126.     }
  4127.  
  4128.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4129.     {    MF3D_Allocate(returnObj->cone);
  4130.  
  4131.         returnObj->cone->orientation.x = vector.x;
  4132.         returnObj->cone->orientation.y = vector.y;
  4133.         returnObj->cone->orientation.z = vector.z;
  4134.  
  4135.         if (result == kMF3DNoErr)
  4136.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4137.                     &returnObj->cone->majorAxis);
  4138.         }
  4139.  
  4140.         if (result == kMF3DNoErr)
  4141.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4142.                     &returnObj->cone->minorAxis);
  4143.         }
  4144.  
  4145.         if (result == kMF3DNoErr)
  4146.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->cone->origin);
  4147.     }
  4148.  
  4149.     if (result == kMF3DNoErr)
  4150.         *outObj = (MF3DVoidObjPtr) returnObj;
  4151.     else
  4152.         MF3D_Free(returnObj);
  4153.  
  4154.     return result;
  4155. }
  4156.  
  4157.  
  4158. /*==============================================================================
  4159.  *    MF3D_ObjConeWriter
  4160.  *==============================================================================
  4161.  */
  4162. MF3DErr
  4163. MF3D_ObjConeWriter(
  4164.     MF3D_FilePtr    inMetafilePtr,
  4165.     MF3DVoidObjPtr    inObj)
  4166. {
  4167.     MF3DConeObjPtr                writeObj;
  4168.     MF3DErr                        result;
  4169.  
  4170.     MF3D_VerifyObjectType(inObj, kMF3DObjCone);
  4171.     writeObj = (MF3DConeObjPtr)inObj;
  4172.  
  4173.     result = kMF3DNoErr;
  4174.  
  4175.     if (writeObj->cone != NULL)
  4176.     {    MF3D_WriteNewLine(inMetafilePtr);
  4177.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->cone->orientation);
  4178.  
  4179.         if (result == kMF3DNoErr)
  4180.         {    MF3D_WriteNewLine(inMetafilePtr);
  4181.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4182.                     writeObj->cone->majorAxis);
  4183.         }
  4184.  
  4185.         if (result == kMF3DNoErr)
  4186.         {    MF3D_WriteNewLine(inMetafilePtr);
  4187.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4188.                 writeObj->cone->minorAxis);
  4189.         }
  4190.  
  4191.         if (result == kMF3DNoErr)
  4192.         {    MF3D_WriteNewLine(inMetafilePtr);
  4193.             result = MF3D_Point3DWrite(inMetafilePtr, writeObj->cone->origin);
  4194.         }
  4195.  
  4196.         if (result == kMF3DNoErr)
  4197.             MF3D_WriteNewLine(inMetafilePtr);
  4198.     }
  4199.  
  4200.     return result;
  4201. }
  4202.  
  4203. /*==============================================================================
  4204.  *    MF3D_ObjConeDisposer
  4205.  *==============================================================================
  4206.  */
  4207. MF3DErr
  4208. MF3D_ObjConeDisposer(
  4209.     MF3DVoidObjPtr    inObj)
  4210. {
  4211.     MF3D_VerifyObjectType(inObj, kMF3DObjCone);
  4212.  
  4213.     if (inObj != NULL)
  4214.     {    if (((MF3DConeObjPtr)inObj)->cone != NULL)
  4215.         MF3D_Free(((MF3DConeObjPtr)inObj)->cone);
  4216.         MF3D_Free(inObj);
  4217.     }
  4218.  
  4219.     return kMF3DNoErr;
  4220. }
  4221.  
  4222. /*==============================================================================
  4223.  *    MF3D_ObjCylinderReader
  4224.  *==============================================================================
  4225.  */
  4226. MF3DErr
  4227. MF3D_ObjCylinderReader(
  4228.     MF3D_FilePtr    inMetafilePtr,
  4229.     MF3DVoidObjPtr    *outObj)
  4230. {
  4231.     MF3DCylinderObjPtr            returnObj;
  4232.     MF3DVector3D                vector;
  4233.     MF3DErr                        numberExists;
  4234.     MF3DErr                        result;
  4235.  
  4236.     result = kMF3DNoErr;
  4237.  
  4238.     MF3D_Allocate(returnObj);
  4239.  
  4240.     if (result == kMF3DNoErr)
  4241.     {    returnObj->cylinder = NULL;
  4242.  
  4243.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4244.     }
  4245.  
  4246.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4247.     {    MF3D_Allocate(returnObj->cylinder);
  4248.  
  4249.         returnObj->cylinder->orientation.x = vector.x;
  4250.         returnObj->cylinder->orientation.y = vector.y;
  4251.         returnObj->cylinder->orientation.z = vector.z;
  4252.  
  4253.         if (result == kMF3DNoErr)
  4254.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4255.                     &returnObj->cylinder->majorAxis);
  4256.         }
  4257.  
  4258.         if (result == kMF3DNoErr)
  4259.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4260.                     &returnObj->cylinder->minorAxis);
  4261.         }
  4262.  
  4263.         if (result == kMF3DNoErr)
  4264.         {    result = MF3D_Point3DRead(inMetafilePtr,
  4265.                     &returnObj->cylinder->origin);
  4266.         }
  4267.     }
  4268.  
  4269.     if (result == kMF3DNoErr)
  4270.         *outObj = (MF3DVoidObjPtr) returnObj;
  4271.     else
  4272.         MF3D_Free(returnObj);
  4273.  
  4274.     return result;
  4275. }
  4276.  
  4277.  
  4278. #if defined(applec) || defined(__MWERKS__) || defined(THINK_C)
  4279. #pragma segment __MFOBJECT3__
  4280. #endif
  4281.  
  4282.  
  4283. /*==============================================================================
  4284.  *    MF3D_ObjCylinderWriter
  4285.  *==============================================================================
  4286.  */
  4287. MF3DErr
  4288. MF3D_ObjCylinderWriter(
  4289.     MF3D_FilePtr    inMetafilePtr,
  4290.     MF3DVoidObjPtr    inObj)
  4291. {
  4292.     MF3DCylinderObjPtr            writeObj;
  4293.     MF3DErr                        result;
  4294.  
  4295.     MF3D_VerifyObjectType(inObj, kMF3DObjCylinder);
  4296.     writeObj = (MF3DCylinderObjPtr)inObj;
  4297.  
  4298.     result = kMF3DNoErr;
  4299.  
  4300.     if (writeObj->cylinder != NULL)
  4301.     {    MF3D_WriteNewLine(inMetafilePtr);
  4302.         result = MF3D_Vector3DWrite(inMetafilePtr,
  4303.                 writeObj->cylinder->orientation);
  4304.  
  4305.         if (result == kMF3DNoErr)
  4306.         {    MF3D_WriteNewLine(inMetafilePtr);
  4307.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4308.                     writeObj->cylinder->majorAxis);
  4309.         }
  4310.  
  4311.         if (result == kMF3DNoErr)
  4312.         {    MF3D_WriteNewLine(inMetafilePtr);
  4313.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4314.                     writeObj->cylinder->minorAxis);
  4315.         }
  4316.  
  4317.         if (result == kMF3DNoErr)
  4318.         {    MF3D_WriteNewLine(inMetafilePtr);
  4319.             result = MF3D_Point3DWrite(inMetafilePtr,
  4320.                     writeObj->cylinder->origin);
  4321.         }
  4322.  
  4323.         if (result == kMF3DNoErr)
  4324.             MF3D_WriteNewLine(inMetafilePtr);
  4325.     }
  4326.  
  4327.     return result;
  4328. }
  4329.  
  4330. /*==============================================================================
  4331.  *    MF3D_ObjCylinderDisposer
  4332.  *==============================================================================
  4333.  */
  4334. MF3DErr
  4335. MF3D_ObjCylinderDisposer(
  4336.     MF3DVoidObjPtr    inObj)
  4337. {
  4338.     MF3D_VerifyObjectType(inObj, kMF3DObjCylinder);
  4339.  
  4340.     if (inObj != NULL)
  4341.     {    if (((MF3DCylinderObjPtr)inObj)->cylinder != NULL)
  4342.         MF3D_Free(((MF3DCylinderObjPtr)inObj)->cylinder);
  4343.         MF3D_Free(inObj);
  4344.     }
  4345.  
  4346.     return kMF3DNoErr;
  4347. }
  4348.  
  4349. /*==============================================================================
  4350.  *    MF3D_ObjDiskReader
  4351.  *==============================================================================
  4352.  */
  4353. MF3DErr
  4354. MF3D_ObjDiskReader(
  4355.     MF3D_FilePtr    inMetafilePtr,
  4356.     MF3DVoidObjPtr    *outObj)
  4357. {
  4358.     MF3DDiskObjPtr                returnObj;
  4359.     MF3DVector3D                vector;
  4360.     MF3DErr                        numberExists;
  4361.     MF3DErr                        result;
  4362.  
  4363.     result = kMF3DNoErr;
  4364.  
  4365.     MF3D_Allocate(returnObj);
  4366.  
  4367.     if (result == kMF3DNoErr)
  4368.     {    returnObj->disk = NULL;
  4369.  
  4370.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4371.     }
  4372.  
  4373.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4374.     {    MF3D_Allocate(returnObj->disk);
  4375.  
  4376.         returnObj->disk->majorRadius.x = vector.x;
  4377.         returnObj->disk->majorRadius.y = vector.y;
  4378.         returnObj->disk->majorRadius.z = vector.z;
  4379.  
  4380.         if (result == kMF3DNoErr)
  4381.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4382.                     &returnObj->disk->minorRadius);
  4383.         }
  4384.  
  4385.         if (result == kMF3DNoErr)
  4386.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->disk->origin);
  4387.     }
  4388.  
  4389.     if (result == kMF3DNoErr)
  4390.         *outObj = (MF3DVoidObjPtr) returnObj;
  4391.     else
  4392.         MF3D_Free(returnObj);
  4393.  
  4394.     return result;
  4395. }
  4396.  
  4397.  
  4398. /*==============================================================================
  4399.  *    MF3D_ObjDiskWriter
  4400.  *==============================================================================
  4401.  */
  4402. MF3DErr
  4403. MF3D_ObjDiskWriter(
  4404.     MF3D_FilePtr    inMetafilePtr,
  4405.     MF3DVoidObjPtr    inObj)
  4406. {
  4407.     MF3DDiskObjPtr                writeObj;
  4408.     MF3DErr                        result;
  4409.  
  4410.     MF3D_VerifyObjectType(inObj, kMF3DObjDisk);
  4411.     writeObj = (MF3DDiskObjPtr)inObj;
  4412.  
  4413.     result = kMF3DNoErr;
  4414.  
  4415.     if (writeObj->disk != NULL)
  4416.     {    MF3D_WriteNewLine(inMetafilePtr);
  4417.         result = MF3D_Vector3DWrite(inMetafilePtr,
  4418.                 writeObj->disk->majorRadius);
  4419.  
  4420.         if (result == kMF3DNoErr)
  4421.         {    MF3D_WriteNewLine(inMetafilePtr);
  4422.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4423.                     writeObj->disk->minorRadius);
  4424.         }
  4425.  
  4426.         if (result == kMF3DNoErr)
  4427.         {    MF3D_WriteNewLine(inMetafilePtr);
  4428.             result = MF3D_Point3DWrite(inMetafilePtr,
  4429.                     writeObj->disk->origin);
  4430.         }
  4431.  
  4432.         if (result == kMF3DNoErr)
  4433.             MF3D_WriteNewLine(inMetafilePtr);
  4434.     }
  4435.  
  4436.     return result;
  4437. }
  4438.  
  4439. /*==============================================================================
  4440.  *    MF3D_ObjDiskDisposer
  4441.  *==============================================================================
  4442.  */
  4443. MF3DErr
  4444. MF3D_ObjDiskDisposer(
  4445.     MF3DVoidObjPtr    inObj)
  4446. {
  4447.     MF3D_VerifyObjectType(inObj, kMF3DObjDisk);
  4448.  
  4449.     if (inObj != NULL)
  4450.     {    MF3D_Free(((MF3DDiskObjPtr)inObj)->disk);
  4451.         MF3D_Free(inObj);
  4452.     }
  4453.  
  4454.     return kMF3DNoErr;
  4455. }
  4456.  
  4457. /*==============================================================================
  4458.  *    MF3D_ObjEllipseReader
  4459.  *==============================================================================
  4460.  */
  4461. MF3DErr
  4462. MF3D_ObjEllipseReader(
  4463.     MF3D_FilePtr    inMetafilePtr,
  4464.     MF3DVoidObjPtr    *outObj)
  4465. {
  4466.     MF3DEllipseObjPtr            returnObj;
  4467.     MF3DVector3D                vector;
  4468.     MF3DErr                        numberExists;
  4469.     MF3DErr                        result;
  4470.  
  4471.     result = kMF3DNoErr;
  4472.  
  4473.     MF3D_Allocate(returnObj);
  4474.  
  4475.     if (result == kMF3DNoErr)
  4476.     {    returnObj->ellipse = NULL;
  4477.  
  4478.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4479.     }
  4480.  
  4481.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4482.     {    MF3D_Allocate(returnObj->ellipse);
  4483.  
  4484.         returnObj->ellipse->majorAxis.x = vector.x;
  4485.         returnObj->ellipse->majorAxis.y = vector.y;
  4486.         returnObj->ellipse->majorAxis.z = vector.z;
  4487.  
  4488.         if (result == kMF3DNoErr)
  4489.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4490.                     &returnObj->ellipse->minorAxis);
  4491.         }
  4492.  
  4493.         if (result == kMF3DNoErr)
  4494.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->ellipse->origin);
  4495.     }
  4496.  
  4497.     if (result == kMF3DNoErr)
  4498.         *outObj = (MF3DVoidObjPtr) returnObj;
  4499.     else
  4500.         MF3D_Free(returnObj);
  4501.  
  4502.     return result;
  4503. }
  4504.  
  4505.  
  4506. /*==============================================================================
  4507.  *    MF3D_ObjEllipseWriter
  4508.  *==============================================================================
  4509.  */
  4510. MF3DErr
  4511. MF3D_ObjEllipseWriter(
  4512.     MF3D_FilePtr    inMetafilePtr,
  4513.     MF3DVoidObjPtr    inObj)
  4514. {
  4515.     MF3DEllipseObjPtr            writeObj;
  4516.     MF3DErr                        result;
  4517.  
  4518.     MF3D_VerifyObjectType(inObj, kMF3DObjEllipse);
  4519.     writeObj = (MF3DEllipseObjPtr)inObj;
  4520.  
  4521.     result = kMF3DNoErr;
  4522.  
  4523.     if (writeObj->ellipse != NULL)
  4524.     {    MF3D_WriteNewLine(inMetafilePtr);
  4525.         result = MF3D_Vector3DWrite(inMetafilePtr,
  4526.                 writeObj->ellipse->majorAxis);
  4527.  
  4528.         if (result == kMF3DNoErr)
  4529.         {    MF3D_WriteNewLine(inMetafilePtr);
  4530.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4531.                     writeObj->ellipse->minorAxis);
  4532.         }
  4533.  
  4534.         if (result == kMF3DNoErr)
  4535.         {    MF3D_WriteNewLine(inMetafilePtr);
  4536.             result = MF3D_Point3DWrite(inMetafilePtr,
  4537.                     writeObj->ellipse->origin);
  4538.         }
  4539.  
  4540.         if (result == kMF3DNoErr)
  4541.             MF3D_WriteNewLine(inMetafilePtr);
  4542.     }
  4543.  
  4544.     return result;
  4545. }
  4546.  
  4547. /*==============================================================================
  4548.  *    MF3D_ObjEllipseDisposer
  4549.  *==============================================================================
  4550.  */
  4551. MF3DErr
  4552. MF3D_ObjEllipseDisposer(
  4553.     MF3DVoidObjPtr    inObj)
  4554. {
  4555.     MF3D_VerifyObjectType(inObj, kMF3DObjEllipse);
  4556.  
  4557.     if (inObj != NULL)
  4558.     {    MF3D_Free(((MF3DEllipseObjPtr)inObj)->ellipse);
  4559.         MF3D_Free(inObj);
  4560.     }
  4561.  
  4562.     return kMF3DNoErr;
  4563. }
  4564.  
  4565. /*==============================================================================
  4566.  *    MF3D_ObjEllipsoidReader
  4567.  *==============================================================================
  4568.  */
  4569. MF3DErr
  4570. MF3D_ObjEllipsoidReader(
  4571.     MF3D_FilePtr    inMetafilePtr,
  4572.     MF3DVoidObjPtr    *outObj)
  4573. {
  4574.     MF3DEllipsoidObjPtr            returnObj;
  4575.     MF3DVector3D                vector;
  4576.     MF3DErr                        numberExists;
  4577.     MF3DErr                        result;
  4578.  
  4579.     result = kMF3DNoErr;
  4580.  
  4581.     MF3D_Allocate(returnObj);
  4582.  
  4583.     if (result == kMF3DNoErr)
  4584.     {    returnObj->ellipsoid = NULL;
  4585.  
  4586.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  4587.     }
  4588.  
  4589.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  4590.     {    MF3D_Allocate(returnObj->ellipsoid);
  4591.  
  4592.         returnObj->ellipsoid->orientation.x = vector.x;
  4593.         returnObj->ellipsoid->orientation.y = vector.y;
  4594.         returnObj->ellipsoid->orientation.z = vector.z;
  4595.  
  4596.         if (result == kMF3DNoErr)
  4597.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4598.                     &returnObj->ellipsoid->majorRadius);
  4599.         }
  4600.  
  4601.         if (result == kMF3DNoErr)
  4602.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  4603.                     &returnObj->ellipsoid->minorRadius);
  4604.         }
  4605.  
  4606.         if (result == kMF3DNoErr)
  4607.         {    result = MF3D_Point3DRead(inMetafilePtr,
  4608.                     &returnObj->ellipsoid->origin);
  4609.         }
  4610.     }
  4611.  
  4612.     if (result == kMF3DNoErr)
  4613.         *outObj = (MF3DVoidObjPtr) returnObj;
  4614.     else
  4615.         MF3D_Free(returnObj);
  4616.  
  4617.     return result;
  4618. }
  4619.  
  4620.  
  4621. /*==============================================================================
  4622.  *    MF3D_ObjEllipsoidWriter
  4623.  *==============================================================================
  4624.  */
  4625. MF3DErr
  4626. MF3D_ObjEllipsoidWriter(
  4627.     MF3D_FilePtr    inMetafilePtr,
  4628.     MF3DVoidObjPtr    inObj)
  4629. {
  4630.     MF3DEllipsoidObjPtr            writeObj;
  4631.     MF3DErr                        result;
  4632.  
  4633.     MF3D_VerifyObjectType(inObj, kMF3DObjEllipsoid);
  4634.     writeObj = (MF3DEllipsoidObjPtr)inObj;
  4635.  
  4636.     result = kMF3DNoErr;
  4637.  
  4638.     if (writeObj->ellipsoid != NULL)
  4639.     {    MF3D_WriteNewLine(inMetafilePtr);
  4640.         result = MF3D_Vector3DWrite(inMetafilePtr,
  4641.                 writeObj->ellipsoid->orientation);
  4642.  
  4643.         if (result == kMF3DNoErr)
  4644.         {    MF3D_WriteNewLine(inMetafilePtr);
  4645.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4646.                     writeObj->ellipsoid->majorRadius);
  4647.         }
  4648.  
  4649.         if (result == kMF3DNoErr)
  4650.         {    MF3D_WriteNewLine(inMetafilePtr);
  4651.             result = MF3D_Vector3DWrite(inMetafilePtr,
  4652.                     writeObj->ellipsoid->minorRadius);
  4653.         }
  4654.  
  4655.         if (result == kMF3DNoErr)
  4656.         {    MF3D_WriteNewLine(inMetafilePtr);
  4657.             result = MF3D_Point3DWrite(inMetafilePtr,
  4658.                     writeObj->ellipsoid->origin);
  4659.         }
  4660.  
  4661.         if (result == kMF3DNoErr)
  4662.             MF3D_WriteNewLine(inMetafilePtr);
  4663.     }
  4664.  
  4665.     return result;
  4666. }
  4667.  
  4668. /*==============================================================================
  4669.  *    MF3D_ObjEllipsoidDisposer
  4670.  *==============================================================================
  4671.  */
  4672. MF3DErr
  4673. MF3D_ObjEllipsoidDisposer(
  4674.     MF3DVoidObjPtr    inObj)
  4675. {
  4676.     MF3D_VerifyObjectType(inObj, kMF3DObjEllipsoid);
  4677.  
  4678.     if (inObj != NULL)
  4679.     {    MF3D_Free(((MF3DEllipsoidObjPtr)inObj)->ellipsoid);
  4680.         MF3D_Free(inObj);
  4681.     }
  4682.  
  4683.     return kMF3DNoErr;
  4684. }
  4685.  
  4686. /*==============================================================================
  4687.  *    MF3D_ObjGeneralPolygonHintReader
  4688.  *==============================================================================
  4689.  */
  4690. MF3DErr
  4691. MF3D_ObjGeneralPolygonHintReader(
  4692.     MF3D_FilePtr    inMetafilePtr,
  4693.     MF3DVoidObjPtr    *outObj)
  4694. {
  4695.     MF3DGeneralPolygonHintObjPtr    returnObj;
  4696.     MF3DErr                            result;
  4697.  
  4698.     result = kMF3DNoErr;
  4699.  
  4700.     MF3D_Allocate(returnObj);
  4701.  
  4702.     if (result == kMF3DNoErr)
  4703.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_GeneralPolygonHintEnum,
  4704.                 &returnObj->shapeHint);
  4705.     }
  4706.  
  4707.     if (result == kMF3DNoErr)
  4708.         *outObj = (MF3DVoidObjPtr) returnObj;
  4709.     else
  4710.         MF3D_Free(returnObj);
  4711.  
  4712.     return result;
  4713. }
  4714.  
  4715. /*==============================================================================
  4716.  *    MF3D_ObjGeneralPolygonHintWriter
  4717.  *==============================================================================
  4718.  */
  4719. MF3DErr
  4720. MF3D_ObjGeneralPolygonHintWriter(
  4721.     MF3D_FilePtr    inMetafilePtr,
  4722.     MF3DVoidObjPtr    inObj)
  4723. {
  4724.     MF3D_VerifyObjectType(inObj, kMF3DObjGeneralPolygonHint);
  4725.     return MF3D_FlagsWrite(inMetafilePtr, gMF3D_GeneralPolygonHintEnum,
  4726.                 ((MF3DGeneralPolygonHintObjPtr)inObj)->shapeHint);
  4727. }
  4728.  
  4729. /*==============================================================================
  4730.  *    MF3D_ObjGeneralPolygonHintDisposer
  4731.  *==============================================================================
  4732.  */
  4733. MF3DErr
  4734. MF3D_ObjGeneralPolygonHintDisposer(
  4735.     MF3DVoidObjPtr    inObj)
  4736. {
  4737.     MF3D_VerifyObjectType(inObj, kMF3DObjGeneralPolygonHint);
  4738.  
  4739.     MF3D_Free(inObj);
  4740.     return kMF3DNoErr;
  4741. }
  4742.  
  4743. /*==============================================================================
  4744.  *    MF3D_ObjGeneralPolygonReader
  4745.  *==============================================================================
  4746.  */
  4747. MF3DErr
  4748. MF3D_ObjGeneralPolygonReader(
  4749.     MF3D_FilePtr    inMetafilePtr,
  4750.     MF3DVoidObjPtr    *outObj)
  4751. {
  4752.     MF3DGeneralPolygonObjPtr    returnObj;
  4753.     MF3DUns32                    numContours;
  4754.     MF3DErr                        result;
  4755.  
  4756.     result = kMF3DNoErr;
  4757.  
  4758.     MF3D_Allocate(returnObj);
  4759.  
  4760.     if (result == kMF3DNoErr)
  4761.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nContours);
  4762.  
  4763.     if (result == kMF3DNoErr)
  4764.     {    numContours = returnObj->nContours;
  4765.         if (numContours <= 0)
  4766.             result = kMF3DErrNumContoursIsZero;
  4767.     }
  4768.  
  4769.     /* Read polygon data */
  4770.  
  4771.     if (result == kMF3DNoErr)
  4772.     {    MF3DPolygonDataPtr        curContourPtr;
  4773.  
  4774.         returnObj->polygons = MF3D_Malloc(numContours *
  4775.                 sizeof(*returnObj->polygons));
  4776.         if (returnObj->polygons == NULL)
  4777.             result = kMF3DErrOutOfMemory;
  4778.  
  4779.         curContourPtr = returnObj->polygons;
  4780.         while (result == kMF3DNoErr && numContours > 0)
  4781.         {    MF3DUns32    numVertices;
  4782.  
  4783.             result = MF3D_Uns32Read(inMetafilePtr, &curContourPtr->nVertices);
  4784.  
  4785.             if (result == kMF3DNoErr)
  4786.             {    numVertices = curContourPtr->nVertices;
  4787.                 if (numVertices <= 2)
  4788.                     result = kMF3DErrTooFewVertices;
  4789.             }
  4790.  
  4791.             if (result == kMF3DNoErr)
  4792.             {    MF3DPoint3DPtr    curVertexPtr;
  4793.  
  4794.                 curContourPtr->vertices = MF3D_Malloc(numVertices *
  4795.                         sizeof(*curContourPtr->vertices));
  4796.                 if (curContourPtr->vertices == NULL)
  4797.                     result = kMF3DErrOutOfMemory;
  4798.  
  4799.                 curVertexPtr = curContourPtr->vertices;
  4800.                 while (result == kMF3DNoErr && numVertices > 0)
  4801.                 {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  4802.                     --numVertices;
  4803.                     ++curVertexPtr;
  4804.                 }
  4805.  
  4806.                 if (result != kMF3DNoErr)
  4807.                     MF3D_Free(curContourPtr->vertices);
  4808.             }
  4809.  
  4810.             --numContours;
  4811.             ++curContourPtr;
  4812.         }
  4813.  
  4814.         if (result != kMF3DNoErr)
  4815.         {    MF3D_Free(returnObj->polygons);
  4816.         }
  4817.     }
  4818.  
  4819.     if (result == kMF3DNoErr)
  4820.         *outObj = (MF3DVoidObjPtr) returnObj;
  4821.     else
  4822.         MF3D_Free(returnObj);
  4823.  
  4824.     return result;
  4825. }
  4826.  
  4827.  
  4828. /*==============================================================================
  4829.  *    MF3D_ObjGeneralPolygonWriter
  4830.  *==============================================================================
  4831.  */
  4832. MF3DErr
  4833. MF3D_ObjGeneralPolygonWriter(
  4834.     MF3D_FilePtr    inMetafilePtr,
  4835.     MF3DVoidObjPtr    inObj)
  4836. {
  4837.     MF3DGeneralPolygonObjPtr    writeObj;
  4838.     MF3DUns32                    numContours;
  4839.     MF3DErr                        result;
  4840.  
  4841.     MF3D_VerifyObjectType(inObj, kMF3DObjGeneralPolygon);
  4842.     writeObj = (MF3DGeneralPolygonObjPtr)inObj;
  4843.  
  4844.     result = kMF3DNoErr;
  4845.  
  4846.     numContours = writeObj->nContours;
  4847.     if (numContours <= 0)
  4848.         result = kMF3DErrNumContoursIsZero;
  4849.  
  4850.     if (result == kMF3DNoErr)
  4851.     {    MF3D_WriteNewLine(inMetafilePtr);
  4852.         result = MF3D_Uns32Write(inMetafilePtr, numContours);
  4853.     }
  4854.  
  4855.     /* Write polygon data */
  4856.  
  4857.     if (result == kMF3DNoErr)
  4858.     {    MF3DPolygonDataPtr        curContourPtr;
  4859.         MF3DUns32                contourNum;
  4860.  
  4861.         MF3D_CommentStrWrite(inMetafilePtr, "nContours");
  4862.  
  4863.         curContourPtr = writeObj->polygons;
  4864.         for (contourNum = 0;
  4865.                 result == kMF3DNoErr && contourNum < numContours;
  4866.                 ++contourNum)
  4867.         {    MF3DUns32    numVertices;
  4868.  
  4869.             numVertices = curContourPtr->nVertices;
  4870.             if (numVertices <= 2)
  4871.                 result = kMF3DErrTooFewVertices;
  4872.  
  4873.             if (result == kMF3DNoErr)
  4874.             {    result = MF3D_Uns32Write(inMetafilePtr,
  4875.                         curContourPtr->nVertices);
  4876.             }
  4877.  
  4878.             if (result == kMF3DNoErr)
  4879.                 MF3D_CommentNumWrite(inMetafilePtr, contourNum);
  4880.  
  4881.             if (result == kMF3DNoErr)
  4882.             {    MF3DPoint3DPtr    curVertexPtr;
  4883.                 MF3DUns32        vertexNum;
  4884.  
  4885.                 curVertexPtr = curContourPtr->vertices;
  4886.                 for (vertexNum = 0;
  4887.                         result == kMF3DNoErr && vertexNum < numVertices;
  4888.                         ++vertexNum)
  4889.                 {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  4890.                     if (result == kMF3DNoErr)
  4891.                         MF3D_WriteNewLine(inMetafilePtr);
  4892.                 }
  4893.             }
  4894.             ++curContourPtr;
  4895.         }
  4896.     }
  4897.  
  4898.     return result;
  4899. }
  4900.  
  4901. /*==============================================================================
  4902.  *    MF3D_ObjGeneralPolygonDisposer
  4903.  *==============================================================================
  4904.  */
  4905. MF3DErr
  4906. MF3D_ObjGeneralPolygonDisposer(
  4907.     MF3DVoidObjPtr    inObj)
  4908. {
  4909.     MF3DGeneralPolygonObjPtr    polygonObj;
  4910.  
  4911.     MF3D_VerifyObjectType(inObj, kMF3DObjGeneralPolygon);
  4912.  
  4913.     polygonObj = (MF3DGeneralPolygonObjPtr) inObj;
  4914.  
  4915.     if (polygonObj != NULL)
  4916.     {    if (polygonObj->polygons != NULL)
  4917.         {    MF3DUns32            numContours;
  4918.             MF3DPolygonDataPtr    contourPtr;
  4919.  
  4920.             contourPtr = polygonObj->polygons;
  4921.             for (numContours = polygonObj->nContours; numContours > 0;
  4922.                     --numContours)
  4923.             {    MF3D_Free(contourPtr->vertices);
  4924.                 ++contourPtr;
  4925.             }
  4926.             MF3D_Free(polygonObj->polygons);
  4927.         }
  4928.  
  4929.         MF3D_Free(polygonObj);
  4930.     }
  4931.     return kMF3DNoErr;
  4932. }
  4933.  
  4934. /*==============================================================================
  4935.  *    MF3D_ObjLineReader
  4936.  *==============================================================================
  4937.  */
  4938. MF3DErr
  4939. MF3D_ObjLineReader(
  4940.     MF3D_FilePtr    inMetafilePtr,
  4941.     MF3DVoidObjPtr    *outObj)
  4942. {
  4943.     MF3DLineObjPtr                returnObj;
  4944.     MF3DErr                        result;
  4945.  
  4946.     result = kMF3DNoErr;
  4947.  
  4948.     MF3D_Allocate(returnObj);
  4949.  
  4950.     if (result == kMF3DNoErr)
  4951.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->start);
  4952.  
  4953.     if (result == kMF3DNoErr)
  4954.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->end);
  4955.  
  4956.     if (result == kMF3DNoErr)
  4957.         *outObj = (MF3DVoidObjPtr) returnObj;
  4958.     else
  4959.         MF3D_Free(returnObj);
  4960.  
  4961.     return result;
  4962. }
  4963.  
  4964.  
  4965. /*==============================================================================
  4966.  *    MF3D_ObjLineWriter
  4967.  *==============================================================================
  4968.  */
  4969. MF3DErr
  4970. MF3D_ObjLineWriter(
  4971.     MF3D_FilePtr    inMetafilePtr,
  4972.     MF3DVoidObjPtr    inObj)
  4973. {
  4974.     MF3DLineObjPtr                writeObj;
  4975.     MF3DErr                        result;
  4976.  
  4977.     MF3D_VerifyObjectType(inObj, kMF3DObjLine);
  4978.     writeObj = (MF3DLineObjPtr)inObj;
  4979.  
  4980.     MF3D_WriteNewLine(inMetafilePtr);
  4981.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->start);
  4982.  
  4983.     if (result == kMF3DNoErr)
  4984.     {    MF3D_WriteNewLine(inMetafilePtr);
  4985.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->end);
  4986.     }
  4987.  
  4988.     if (result == kMF3DNoErr)
  4989.         MF3D_WriteNewLine(inMetafilePtr);
  4990.  
  4991.     return result;
  4992. }
  4993.  
  4994. /*==============================================================================
  4995.  *    MF3D_ObjLineDisposer
  4996.  *==============================================================================
  4997.  */
  4998. MF3DErr
  4999. MF3D_ObjLineDisposer(
  5000.     MF3DVoidObjPtr    inObj)
  5001. {
  5002.     MF3D_VerifyObjectType(inObj, kMF3DObjLine);
  5003.  
  5004.     MF3D_Free(inObj);
  5005.     return kMF3DNoErr;
  5006. }
  5007.  
  5008. /*==============================================================================
  5009.  *    MF3D_ObjMarkerReader
  5010.  *==============================================================================
  5011.  */
  5012. MF3DErr
  5013. MF3D_ObjMarkerReader(
  5014.     MF3D_FilePtr    inMetafilePtr,
  5015.     MF3DVoidObjPtr    *outObj)
  5016. {
  5017.     MF3DMarkerObjPtr            returnObj;
  5018.     MF3DUns32                    imageSize;
  5019.     MF3DErr                        result;
  5020.  
  5021.     result = kMF3DNoErr;
  5022.  
  5023.     MF3D_Allocate(returnObj);
  5024.  
  5025.     if (result == kMF3DNoErr)
  5026.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->location);
  5027.  
  5028.     if (result == kMF3DNoErr)
  5029.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->width);
  5030.  
  5031.     if (result == kMF3DNoErr)
  5032.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->height);
  5033.  
  5034.     if (result == kMF3DNoErr)
  5035.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->rowBytes);
  5036.  
  5037.     if (result == kMF3DNoErr)
  5038.         result = MF3D_Int32Read(inMetafilePtr, &returnObj->xOffset);
  5039.  
  5040.     if (result == kMF3DNoErr)
  5041.         result = MF3D_Int32Read(inMetafilePtr, &returnObj->yOffset);
  5042.  
  5043.     if (result == kMF3DNoErr)
  5044.     {    imageSize = returnObj->height * returnObj->rowBytes;
  5045.         if (imageSize == 0)
  5046.             result = kMF3DErrWidthOrHeightIsZero;
  5047.     }
  5048.  
  5049.     if (result == kMF3DNoErr)
  5050.     {    returnObj->data = MF3D_Malloc(imageSize);
  5051.         if (returnObj->data == NULL)
  5052.             result = kMF3DErrOutOfMemory;
  5053.     }
  5054.  
  5055.     if (result == kMF3DNoErr)
  5056.     {    result = MF3D_RawDataRead(inMetafilePtr, imageSize, returnObj->data);
  5057.         if (result != kMF3DNoErr)
  5058.             MF3D_Free(returnObj->data);
  5059.     }
  5060.  
  5061.     if (result == kMF3DNoErr)
  5062.         *outObj = (MF3DVoidObjPtr) returnObj;
  5063.     else
  5064.         MF3D_Free(returnObj);
  5065.  
  5066.     return result;
  5067. }
  5068.  
  5069.  
  5070. /*==============================================================================
  5071.  *    MF3D_ObjMarkerWriter
  5072.  *==============================================================================
  5073.  */
  5074. MF3DErr
  5075. MF3D_ObjMarkerWriter(
  5076.     MF3D_FilePtr    inMetafilePtr,
  5077.     MF3DVoidObjPtr    inObj)
  5078. {
  5079.     MF3DMarkerObjPtr            writeObj;
  5080.     MF3DUns32                    imageSize;
  5081.     MF3DErr                        result;
  5082.  
  5083.     MF3D_VerifyObjectType(inObj, kMF3DObjMarker);
  5084.     writeObj = (MF3DMarkerObjPtr)inObj;
  5085.  
  5086.     result = kMF3DNoErr;
  5087.  
  5088.     imageSize = writeObj->height * writeObj->rowBytes;
  5089.     if (imageSize == 0)
  5090.         result = kMF3DErrWidthOrHeightIsZero;
  5091.  
  5092.     if (result == kMF3DNoErr)
  5093.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->location);
  5094.  
  5095.     if (result == kMF3DNoErr)
  5096.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->width);
  5097.  
  5098.     if (result == kMF3DNoErr)
  5099.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->height);
  5100.  
  5101.     if (result == kMF3DNoErr)
  5102.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->rowBytes);
  5103.  
  5104.     if (result == kMF3DNoErr)
  5105.         result = MF3D_Int32Write(inMetafilePtr, writeObj->xOffset);
  5106.  
  5107.     if (result == kMF3DNoErr)
  5108.         result = MF3D_Int32Write(inMetafilePtr, writeObj->yOffset);
  5109.  
  5110.     if (result == kMF3DNoErr)
  5111.         result = MF3D_RawDataWrite(inMetafilePtr, imageSize, writeObj->data);
  5112.  
  5113.     return result;
  5114. }
  5115.  
  5116. /*==============================================================================
  5117.  *    MF3D_ObjMarkerDisposer
  5118.  *==============================================================================
  5119.  */
  5120. MF3DErr
  5121. MF3D_ObjMarkerDisposer(
  5122.     MF3DVoidObjPtr    inObj)
  5123. {
  5124.     MF3D_VerifyObjectType(inObj, kMF3DObjMarker);
  5125.  
  5126.     if (inObj != NULL)
  5127.     {    MF3D_Free(((MF3DMarkerObjPtr)inObj)->data);
  5128.         MF3D_Free(inObj);
  5129.     }
  5130.     return kMF3DNoErr;
  5131. }
  5132.  
  5133. /*==============================================================================
  5134.  *    MF3D_ObjMeshReader
  5135.  *==============================================================================
  5136.  */
  5137. MF3DErr
  5138. MF3D_ObjMeshReader(
  5139.     MF3D_FilePtr    inMetafilePtr,
  5140.     MF3DVoidObjPtr    *outObj)
  5141. {
  5142.     MF3DMeshObjPtr                returnObj;
  5143.     MF3DUns32                    numVertices;
  5144.     MF3DErr                        result;
  5145.  
  5146.     result = kMF3DNoErr;
  5147.  
  5148.     MF3D_Allocate(returnObj);
  5149.  
  5150.     if (result == kMF3DNoErr)
  5151.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nVertices);
  5152.  
  5153.     if (result == kMF3DNoErr)
  5154.     {    numVertices = returnObj->nVertices;
  5155.         if (numVertices <= 2)
  5156.             result = kMF3DErrTooFewVertices;
  5157.     }
  5158.  
  5159.     if (result == kMF3DNoErr)
  5160.     {    MF3DPoint3DPtr    curVertexPtr;
  5161.  
  5162.         returnObj->vertices = MF3D_Malloc(numVertices *
  5163.                 sizeof(*returnObj->vertices));
  5164.         if (returnObj->vertices == NULL)
  5165.             result = kMF3DErrOutOfMemory;
  5166.  
  5167.         curVertexPtr = returnObj->vertices;
  5168.         while (result == kMF3DNoErr && numVertices > 0)
  5169.         {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  5170.             --numVertices;
  5171.             ++curVertexPtr;
  5172.         }
  5173.  
  5174.         if (result != kMF3DNoErr)
  5175.             MF3D_Free(returnObj->vertices);
  5176.     }
  5177.  
  5178.     if (result == kMF3DNoErr)
  5179.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nFaces);
  5180.  
  5181.     if (result == kMF3DNoErr)
  5182.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nContours);
  5183.  
  5184.     if (result == kMF3DNoErr)
  5185.     {    MF3DUns32    numMeshFaces;
  5186.  
  5187.         numMeshFaces = returnObj->nFaces + returnObj->nContours;
  5188.  
  5189.         if (numMeshFaces == 0)
  5190.         {    returnObj->faces = NULL;
  5191.         }
  5192.         else
  5193.         {    MF3DMeshFacePtr    curMeshFacePtr;
  5194.         
  5195.             returnObj->faces = MF3D_Malloc(numMeshFaces *
  5196.                     sizeof(*returnObj->faces));
  5197.             if (returnObj->faces == NULL)
  5198.                 result = kMF3DErrOutOfMemory;
  5199.     
  5200.             curMeshFacePtr = returnObj->faces;
  5201.             while (result == kMF3DNoErr && numMeshFaces > 0)
  5202.             {    MF3DUns32    numFaceVertexIndices;
  5203.  
  5204.                 result = MF3D_Uns32Read(inMetafilePtr,
  5205.                         &curMeshFacePtr->nFaceVertexIndices);
  5206.  
  5207.                 if (result == kMF3DNoErr)
  5208.                 {    numFaceVertexIndices = curMeshFacePtr->nFaceVertexIndices;
  5209.                     if (numFaceVertexIndices <= 2)
  5210.                         result = kMF3DErrTooFewVertices;
  5211.                 }
  5212.  
  5213.                 if (result == kMF3DNoErr)
  5214.                 {    MF3DUns32Ptr    curVertexPtr;
  5215.  
  5216.                     curMeshFacePtr->faceVertexIndices =
  5217.                             MF3D_Malloc(numFaceVertexIndices *
  5218.                             sizeof(*curMeshFacePtr->faceVertexIndices));
  5219.                     if (curMeshFacePtr->faceVertexIndices == NULL)
  5220.                         result = kMF3DErrOutOfMemory;
  5221.  
  5222.                     curVertexPtr = curMeshFacePtr->faceVertexIndices;
  5223.                     while (result == kMF3DNoErr && numFaceVertexIndices > 0)
  5224.                     {    result = MF3D_Uns32Read(inMetafilePtr, curVertexPtr);
  5225.                         --numFaceVertexIndices;
  5226.                         ++curVertexPtr;
  5227.                     }
  5228.  
  5229.                     if (result != kMF3DNoErr)
  5230.                         MF3D_Free(curMeshFacePtr->faceVertexIndices);
  5231.                 }
  5232.  
  5233.                 --numMeshFaces;
  5234.                 ++curMeshFacePtr;
  5235.             }
  5236.  
  5237.             if (result != kMF3DNoErr)
  5238.                 MF3D_Free(returnObj->faces);
  5239.         }
  5240.     }
  5241.  
  5242.     if (result == kMF3DNoErr)
  5243.         *outObj = (MF3DVoidObjPtr) returnObj;
  5244.     else
  5245.         MF3D_Free(returnObj);
  5246.  
  5247.     return result;
  5248. }
  5249.  
  5250. /*==============================================================================
  5251.  *    MF3D_ObjMeshWriter
  5252.  *==============================================================================
  5253.  */
  5254. MF3DErr
  5255. MF3D_ObjMeshWriter(
  5256.     MF3D_FilePtr    inMetafilePtr,
  5257.     MF3DVoidObjPtr    inObj)
  5258. {
  5259.     MF3DMeshObjPtr    meshObj;
  5260.     MF3DUns32        nVertices;
  5261.     MF3DErr            result;
  5262.  
  5263.     MF3D_VerifyObjectType(inObj, kMF3DObjMesh);
  5264.     meshObj = (MF3DMeshObjPtr)inObj;
  5265.  
  5266.     result = kMF3DNoErr;
  5267.  
  5268.     MF3D_WriteNewLine(inMetafilePtr);
  5269.  
  5270.     if (result == kMF3DNoErr)
  5271.     {    nVertices = meshObj->nVertices;
  5272.         if (nVertices <= 2)
  5273.             result = kMF3DErrTooFewVertices;
  5274.     }
  5275.  
  5276.     result = MF3D_Uns32Write(inMetafilePtr, nVertices);
  5277.  
  5278.     if (result == kMF3DNoErr)
  5279.     {    MF3DUns32        vertexNum;
  5280.         MF3DPoint3DPtr    curVertexPtr;
  5281.  
  5282.         MF3D_CommentStrWrite(inMetafilePtr, "nVertices");
  5283.  
  5284.         curVertexPtr = meshObj->vertices;
  5285.         for (vertexNum = 0;
  5286.                 result == kMF3DNoErr && vertexNum < nVertices;
  5287.                 ++vertexNum)
  5288.         {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  5289.             if (result == kMF3DNoErr)
  5290.                 MF3D_CommentNumWrite(inMetafilePtr, vertexNum);
  5291.         }
  5292.     }
  5293.  
  5294.     if (result == kMF3DNoErr)
  5295.         result = MF3D_Uns32Write(inMetafilePtr, meshObj->nFaces);
  5296.  
  5297.     if (result == kMF3DNoErr)
  5298.     {    MF3D_CommentStrWrite(inMetafilePtr, "nFaces");
  5299.         result = MF3D_Uns32Write(inMetafilePtr, meshObj->nContours);
  5300.     }
  5301.  
  5302.     if (result == kMF3DNoErr)
  5303.     {    MF3DUns32        faceNum, nMeshFaces;
  5304.         MF3DMeshFacePtr    curMeshFacePtr;
  5305.  
  5306.         MF3D_CommentStrWrite(inMetafilePtr, "nContours");
  5307.  
  5308.         nMeshFaces = meshObj->nFaces + meshObj->nContours;
  5309.         curMeshFacePtr = meshObj->faces;
  5310.         for (faceNum = 0;
  5311.                 result == kMF3DNoErr && faceNum < nMeshFaces;
  5312.                 ++faceNum)
  5313.         {    MF3DUns32        faceVertexNum, nFaceVertexIndices;
  5314.             MF3DUns32Ptr    curFaceVertexPtr;
  5315.  
  5316.             nFaceVertexIndices = curMeshFacePtr->nFaceVertexIndices;
  5317.             if (nFaceVertexIndices <= 2)
  5318.                 result = kMF3DErrTooFewVertices;
  5319.             else
  5320.                 result = MF3D_Uns32Write(inMetafilePtr, nFaceVertexIndices);
  5321.  
  5322.             curFaceVertexPtr = curMeshFacePtr->faceVertexIndices;
  5323.             for (faceVertexNum = 0;
  5324.                     result == kMF3DNoErr && faceVertexNum < nFaceVertexIndices;
  5325.                     ++faceVertexNum)
  5326.             {    result = MF3D_Uns32Write(inMetafilePtr, *curFaceVertexPtr++);
  5327.             }
  5328.             MF3D_CommentNumWrite(inMetafilePtr, faceNum);
  5329.             ++curMeshFacePtr;
  5330.         }
  5331.     }
  5332.  
  5333.     return result;
  5334. }
  5335.  
  5336. /*==============================================================================
  5337.  *    MF3D_ObjMeshDisposer
  5338.  *==============================================================================
  5339.  */
  5340. MF3DErr
  5341. MF3D_ObjMeshDisposer(
  5342.     MF3DVoidObjPtr    inObj)
  5343. {
  5344.     MF3DMeshObjPtr    meshObj;
  5345.  
  5346.     MF3D_VerifyObjectType(inObj, kMF3DObjMesh);
  5347.  
  5348.     meshObj = (MF3DMeshObjPtr) inObj;
  5349.  
  5350.     if (meshObj != NULL)
  5351.     {    if (meshObj->faces != NULL)
  5352.         {    MF3DUns32            numMeshFaces;
  5353.             MF3DMeshFacePtr        curMeshFacePtr;
  5354.  
  5355.             curMeshFacePtr = meshObj->faces;
  5356.             for (numMeshFaces = meshObj->nFaces + meshObj->nContours;
  5357.                     numMeshFaces > 0; --numMeshFaces)
  5358.             {    MF3D_Free(curMeshFacePtr->faceVertexIndices);
  5359.                 ++curMeshFacePtr;
  5360.             }
  5361.             MF3D_Free(meshObj->faces);
  5362.         }
  5363.         MF3D_Free(meshObj->vertices);
  5364.         MF3D_Free(meshObj);
  5365.     }
  5366.  
  5367.     return kMF3DNoErr;
  5368. }
  5369.  
  5370. /*==============================================================================
  5371.  *    MF3D_ObjNURBCurveReader
  5372.  *==============================================================================
  5373.  */
  5374. MF3DErr
  5375. MF3D_ObjNURBCurveReader(
  5376.     MF3D_FilePtr    inMetafilePtr,
  5377.     MF3DVoidObjPtr    *outObj)
  5378. {
  5379.     MF3DNURBCurveObjPtr            returnObj;
  5380.     MF3DUns32                    order;
  5381.     MF3DUns32                    numPoints;
  5382.     MF3DUns32                    numKnots;
  5383.     MF3DErr                        result;
  5384.  
  5385.     result = kMF3DNoErr;
  5386.  
  5387.     MF3D_Allocate(returnObj);
  5388.  
  5389.     if (result == kMF3DNoErr)
  5390.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->order);
  5391.  
  5392.     if (result == kMF3DNoErr)
  5393.     {    order = returnObj->order;
  5394.         if (order < 2)
  5395.             result = kMF3DErrOrderTooSmall;
  5396.     }
  5397.  
  5398.     if (result == kMF3DNoErr)
  5399.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nPoints);
  5400.  
  5401.     if (result == kMF3DNoErr)
  5402.     {    numPoints = returnObj->nPoints;
  5403.         numKnots = numPoints + order;
  5404.         if (numPoints < 2)
  5405.             result = kMF3DErrTooFewPoints;
  5406.     }
  5407.  
  5408.     if (result == kMF3DNoErr)
  5409.     {    MF3DRationalPoint4DPtr        curPointPtr;
  5410.  
  5411.         returnObj->points = MF3D_Malloc(numPoints *
  5412.                 sizeof(*returnObj->points));
  5413.         if (returnObj->points == NULL)
  5414.             result = kMF3DErrOutOfMemory;
  5415.  
  5416.         curPointPtr = returnObj->points;
  5417.         while (result == kMF3DNoErr && numPoints > 0)
  5418.         {    result = MF3D_RationalPoint4DRead(inMetafilePtr, curPointPtr);
  5419.             --numPoints;
  5420.             ++curPointPtr;
  5421.         }
  5422.  
  5423.         if (result != kMF3DNoErr)
  5424.         {    MF3D_Free(returnObj->points);
  5425.         }
  5426.     }
  5427.  
  5428.     if (result == kMF3DNoErr)
  5429.     {    MF3DKnotPtr        curKnotPtr;
  5430.  
  5431.         returnObj->knots = MF3D_Malloc(numKnots * sizeof(*returnObj->knots));
  5432.         if (returnObj->knots == NULL)
  5433.             result = kMF3DErrOutOfMemory;
  5434.  
  5435.         curKnotPtr = returnObj->knots;
  5436.         while (result == kMF3DNoErr && numKnots > 0)
  5437.         {    result = MF3D_Float32Read(inMetafilePtr, curKnotPtr);
  5438.             --numKnots;
  5439.             ++curKnotPtr;
  5440.         }
  5441.  
  5442.         if (result != kMF3DNoErr)
  5443.         {    MF3D_Free(returnObj->knots);
  5444.         }
  5445.     }
  5446.  
  5447.     if (result == kMF3DNoErr)
  5448.         *outObj = (MF3DVoidObjPtr) returnObj;
  5449.     else
  5450.         MF3D_Free(returnObj);
  5451.  
  5452.     return result;
  5453. }
  5454.  
  5455. /*==============================================================================
  5456.  *    MF3D_ObjNURBCurveWriter
  5457.  *==============================================================================
  5458.  */
  5459. MF3DErr
  5460. MF3D_ObjNURBCurveWriter(
  5461.     MF3D_FilePtr    inMetafilePtr,
  5462.     MF3DVoidObjPtr    inObj)
  5463. {
  5464.     MF3DNURBCurveObjPtr            writeObj;
  5465.     MF3DUns32                    order;
  5466.     MF3DUns32                    numPoints;
  5467.     MF3DUns32                    numKnots;
  5468.     MF3DErr                        result;
  5469.  
  5470.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBCurve);
  5471.     writeObj = (MF3DNURBCurveObjPtr)inObj;
  5472.  
  5473.     result = kMF3DNoErr;
  5474.  
  5475.     numPoints = writeObj->nPoints;
  5476.     order = writeObj->order;
  5477.  
  5478.     if (order < 2)
  5479.         result = kMF3DErrOrderTooSmall;
  5480.  
  5481.     if (result == kMF3DNoErr)
  5482.     {    numKnots = numPoints + order;
  5483.         if (numPoints < 2)
  5484.             result = kMF3DErrTooFewPoints;
  5485.     }
  5486.  
  5487.     if (result == kMF3DNoErr)
  5488.     {    MF3D_WriteNewLine(inMetafilePtr);
  5489.         result = MF3D_Uns32Write(inMetafilePtr, order);
  5490.     }
  5491.  
  5492.     if (result == kMF3DNoErr)
  5493.     {    MF3D_CommentStrWrite(inMetafilePtr, "order");
  5494.         result = MF3D_Uns32Write(inMetafilePtr, numPoints);
  5495.     }
  5496.  
  5497.     if (result == kMF3DNoErr)
  5498.         MF3D_CommentStrWrite(inMetafilePtr, "nPoints");
  5499.  
  5500.     if (result == kMF3DNoErr)
  5501.     {    MF3DRationalPoint4DPtr    curPointPtr;
  5502.         MF3DUns32                pointNum;
  5503.  
  5504.         curPointPtr = writeObj->points;
  5505.         for (pointNum = 0;
  5506.                 result == kMF3DNoErr && pointNum < numPoints;
  5507.                 ++pointNum)
  5508.         {    result = MF3D_RationalPoint4DWrite(inMetafilePtr, *curPointPtr++);
  5509.             if (result == kMF3DNoErr)
  5510.                 MF3D_CommentNumWrite(inMetafilePtr, pointNum);
  5511.         }
  5512.     }
  5513.  
  5514.     if (result == kMF3DNoErr)
  5515.         MF3D_CommentStrWrite(inMetafilePtr, "knots");
  5516.  
  5517.     if (result == kMF3DNoErr)
  5518.     {    MF3DKnotPtr        curKnotPtr;
  5519.         MF3DUns32        knotNum;
  5520.  
  5521.         curKnotPtr = writeObj->knots;
  5522.         for (knotNum = 0;
  5523.                 result == kMF3DNoErr && knotNum < numKnots;
  5524.                 ++knotNum)
  5525.         {    result = MF3D_Float32Write(inMetafilePtr, *curKnotPtr++);
  5526.             if (result == kMF3DNoErr)
  5527.                 MF3D_CommentNumWrite(inMetafilePtr, knotNum);
  5528.         }
  5529.     }
  5530.  
  5531.     return result;
  5532. }
  5533.  
  5534. /*==============================================================================
  5535.  *    MF3D_ObjNURBCurveDisposer
  5536.  *==============================================================================
  5537.  */
  5538. MF3DErr
  5539. MF3D_ObjNURBCurveDisposer(
  5540.     MF3DVoidObjPtr    inObj)
  5541. {
  5542.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBCurve);
  5543.  
  5544.     if (inObj != NULL)
  5545.     {    MF3D_Free(((MF3DNURBCurveObjPtr)inObj)->points);
  5546.         MF3D_Free(((MF3DNURBCurveObjPtr)inObj)->knots);
  5547.         MF3D_Free(inObj);
  5548.     }
  5549.     return kMF3DNoErr;
  5550. }
  5551.  
  5552. /*==============================================================================
  5553.  *    MF3D_ObjNURBPatchReader
  5554.  *==============================================================================
  5555.  */
  5556. MF3DErr
  5557. MF3D_ObjNURBPatchReader(
  5558.     MF3D_FilePtr    inMetafilePtr,
  5559.     MF3DVoidObjPtr    *outObj)
  5560. {
  5561.     MF3DNurbPatchObjPtr            returnObj;
  5562.     MF3DUns32                    uOrder;
  5563.     MF3DUns32                    vOrder;
  5564.     MF3DUns32                    numColumns;
  5565.     MF3DUns32                    numRows;
  5566.     MF3DUns32                    numPoints;
  5567.     MF3DUns32                    numUKnots;
  5568.     MF3DUns32                    numVKnots;
  5569.     MF3DErr                        result;
  5570.  
  5571.     result = kMF3DNoErr;
  5572.  
  5573.     MF3D_Allocate(returnObj);
  5574.  
  5575.     if (result == kMF3DNoErr)
  5576.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->uOrder);
  5577.     if (result == kMF3DNoErr)
  5578.     {    uOrder = returnObj->uOrder;
  5579.         if (uOrder < 2)
  5580.             result = kMF3DErrOrderTooSmall;
  5581.     }
  5582.  
  5583.     if (result == kMF3DNoErr)
  5584.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->vOrder);
  5585.     if (result == kMF3DNoErr)
  5586.     {    vOrder = returnObj->vOrder;
  5587.         if (vOrder < 2)
  5588.             result = kMF3DErrOrderTooSmall;
  5589.     }
  5590.  
  5591.     if (result == kMF3DNoErr)
  5592.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->numColumns);
  5593.     if (result == kMF3DNoErr)
  5594.     {    numColumns = returnObj->numColumns;
  5595.         if (numColumns < 2)
  5596.             result = kMF3DErrTooFewPoints;
  5597.     }
  5598.  
  5599.     if (result == kMF3DNoErr)
  5600.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->numRows);
  5601.     if (result == kMF3DNoErr)
  5602.     {    numRows = returnObj->numRows;
  5603.         if (numRows < 2)
  5604.             result = kMF3DErrTooFewPoints;
  5605.     }
  5606.  
  5607.     if (result == kMF3DNoErr)
  5608.     {    MF3DRationalPoint4DPtr        curPointPtr;
  5609.  
  5610.         numPoints = numColumns * numRows;
  5611.         numUKnots = uOrder + numColumns;
  5612.         numVKnots = vOrder + numRows;
  5613.  
  5614.         returnObj->points = MF3D_Malloc(numPoints * sizeof(*returnObj->points));
  5615.         if (returnObj->points == NULL)
  5616.             result = kMF3DErrOutOfMemory;
  5617.  
  5618.         curPointPtr = returnObj->points;
  5619.         while (result == kMF3DNoErr && numPoints > 0)
  5620.         {    result = MF3D_RationalPoint4DRead(inMetafilePtr, curPointPtr);
  5621.             --numPoints;
  5622.             ++curPointPtr;
  5623.         }
  5624.  
  5625.         if (result != kMF3DNoErr)
  5626.         {    MF3D_Free(returnObj->points);
  5627.         }
  5628.     }
  5629.  
  5630.     if (result == kMF3DNoErr)
  5631.     {    MF3DKnotPtr        curKnotPtr;
  5632.  
  5633.         returnObj->uKnots = MF3D_Malloc(numUKnots * sizeof(*returnObj->uKnots));
  5634.         if (returnObj->uKnots == NULL)
  5635.             result = kMF3DErrOutOfMemory;
  5636.  
  5637.         curKnotPtr = returnObj->uKnots;
  5638.         while (result == kMF3DNoErr && numUKnots > 0)
  5639.         {    result = MF3D_Float32Read(inMetafilePtr, curKnotPtr);
  5640.             --numUKnots;
  5641.             ++curKnotPtr;
  5642.         }
  5643.  
  5644.         if (result != kMF3DNoErr)
  5645.         {    MF3D_Free(returnObj->uKnots);
  5646.         }
  5647.     }
  5648.  
  5649.     if (result == kMF3DNoErr)
  5650.     {    MF3DKnotPtr        curKnotPtr;
  5651.  
  5652.         returnObj->vKnots = MF3D_Malloc(numVKnots * sizeof(*returnObj->vKnots));
  5653.         if (returnObj->vKnots == NULL)
  5654.             result = kMF3DErrOutOfMemory;
  5655.  
  5656.         curKnotPtr = returnObj->vKnots;
  5657.         while (result == kMF3DNoErr && numVKnots > 0)
  5658.         {    result = MF3D_Float32Read(inMetafilePtr, curKnotPtr);
  5659.             --numVKnots;
  5660.             ++curKnotPtr;
  5661.         }
  5662.  
  5663.         if (result != kMF3DNoErr)
  5664.         {    MF3D_Free(returnObj->vKnots);
  5665.         }
  5666.     }
  5667.  
  5668.     if (result == kMF3DNoErr)
  5669.         *outObj = (MF3DVoidObjPtr) returnObj;
  5670.     else
  5671.         MF3D_Free(returnObj);
  5672.  
  5673.     return result;
  5674. }
  5675.  
  5676. /*==============================================================================
  5677.  *    MF3D_ObjNURBPatchWriter
  5678.  *==============================================================================
  5679.  */
  5680. MF3DErr
  5681. MF3D_ObjNURBPatchWriter(
  5682.     MF3D_FilePtr    inMetafilePtr,
  5683.     MF3DVoidObjPtr    inObj)
  5684. {
  5685.     MF3DNurbPatchObjPtr            writeObj;
  5686.     MF3DUns32                    uOrder;
  5687.     MF3DUns32                    vOrder;
  5688.     MF3DUns32                    numColumns;
  5689.     MF3DUns32                    numRows;
  5690.     MF3DUns32                    numPoints;
  5691.     MF3DUns32                    numUKnots;
  5692.     MF3DUns32                    numVKnots;
  5693.     MF3DErr                        result;
  5694.  
  5695.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBPatch);
  5696.     writeObj = (MF3DNurbPatchObjPtr)inObj;
  5697.  
  5698.     result = kMF3DNoErr;
  5699.  
  5700.     uOrder = writeObj->uOrder;
  5701.     if (uOrder < 2)
  5702.         result = kMF3DErrOrderTooSmall;
  5703.  
  5704.     if (result == kMF3DNoErr)
  5705.     {    vOrder = writeObj->vOrder;
  5706.         if (vOrder < 2)
  5707.             result = kMF3DErrOrderTooSmall;
  5708.     }
  5709.  
  5710.     if (result == kMF3DNoErr)
  5711.     {    numColumns = writeObj->numColumns;
  5712.         if (numColumns < 2)
  5713.             result = kMF3DErrTooFewPoints;
  5714.     }
  5715.  
  5716.     if (result == kMF3DNoErr)
  5717.     {    numRows = writeObj->numRows;
  5718.         if (numRows < 2)
  5719.             result = kMF3DErrTooFewPoints;
  5720.     }
  5721.  
  5722.     if (result == kMF3DNoErr)
  5723.     {    MF3D_WriteNewLine(inMetafilePtr);
  5724.         result = MF3D_Uns32Write(inMetafilePtr, uOrder);
  5725.     }
  5726.  
  5727.     if (result == kMF3DNoErr)
  5728.         result = MF3D_Uns32Write(inMetafilePtr, vOrder);
  5729.  
  5730.     if (result == kMF3DNoErr)
  5731.         result = MF3D_Uns32Write(inMetafilePtr, numColumns);
  5732.  
  5733.     if (result == kMF3DNoErr)
  5734.         result = MF3D_Uns32Write(inMetafilePtr, numRows);
  5735.  
  5736.     if (result == kMF3DNoErr)
  5737.     {    MF3DRationalPoint4DPtr    curPointPtr;
  5738.         MF3DUns32                pointNum;
  5739.  
  5740.         MF3D_WriteNewLine(inMetafilePtr);
  5741.  
  5742.         numPoints = numColumns * numRows;
  5743.         numUKnots = uOrder + numColumns;
  5744.         numVKnots = vOrder + numRows;
  5745.  
  5746.         curPointPtr = writeObj->points;
  5747.         for (pointNum = 0;
  5748.                 result == kMF3DNoErr && pointNum < numPoints;
  5749.                 ++pointNum)
  5750.         {    result = MF3D_RationalPoint4DWrite(inMetafilePtr, *curPointPtr++);
  5751.             if (result == kMF3DNoErr)
  5752.                 MF3D_CommentNumWrite(inMetafilePtr, pointNum);
  5753.         }
  5754.     }
  5755.  
  5756.     if (result == kMF3DNoErr)
  5757.     {    MF3DKnotPtr        curKnotPtr;
  5758.         MF3DUns32        knotNum;
  5759.  
  5760.         MF3D_WriteNewLine(inMetafilePtr);
  5761.         MF3D_CommentStrWrite(inMetafilePtr, "uKnots");
  5762.         curKnotPtr = writeObj->uKnots;
  5763.         for (knotNum = 0;
  5764.                 result == kMF3DNoErr && knotNum < numUKnots;
  5765.                 ++knotNum)
  5766.         {    result = MF3D_Float32Write(inMetafilePtr, *curKnotPtr++);
  5767.             if (result == kMF3DNoErr)
  5768.                 MF3D_CommentNumWrite(inMetafilePtr, knotNum);
  5769.         }
  5770.     }
  5771.  
  5772.     if (result == kMF3DNoErr)
  5773.     {    MF3DKnotPtr        curKnotPtr;
  5774.         MF3DUns32        knotNum;
  5775.  
  5776.         MF3D_WriteNewLine(inMetafilePtr);
  5777.         MF3D_CommentStrWrite(inMetafilePtr, "vKnots");
  5778.         curKnotPtr = writeObj->vKnots;
  5779.         for (knotNum = 0;
  5780.                 result == kMF3DNoErr && knotNum < numVKnots;
  5781.                 ++knotNum)
  5782.         {    result = MF3D_Float32Write(inMetafilePtr, *curKnotPtr++);
  5783.             if (result == kMF3DNoErr)
  5784.                 MF3D_CommentNumWrite(inMetafilePtr, knotNum);
  5785.         }
  5786.     }
  5787.  
  5788.     return result;
  5789. }
  5790.  
  5791. /*==============================================================================
  5792.  *    MF3D_ObjNURBPatchDisposer
  5793.  *==============================================================================
  5794.  */
  5795. MF3DErr
  5796. MF3D_ObjNURBPatchDisposer(
  5797.     MF3DVoidObjPtr    inObj)
  5798. {
  5799.     MF3D_VerifyObjectType(inObj, kMF3DObjNURBPatch);
  5800.  
  5801.     if (inObj != NULL)
  5802.     {    MF3D_Free(((MF3DNurbPatchObjPtr)inObj)->points);
  5803.         MF3D_Free(((MF3DNurbPatchObjPtr)inObj)->uKnots);
  5804.         MF3D_Free(((MF3DNurbPatchObjPtr)inObj)->vKnots);
  5805.         MF3D_Free(inObj);
  5806.     }
  5807.     return kMF3DNoErr;
  5808. }
  5809.  
  5810. /*==============================================================================
  5811.  *    MF3D_ObjPointReader
  5812.  *==============================================================================
  5813.  */
  5814. MF3DErr
  5815. MF3D_ObjPointReader(
  5816.     MF3D_FilePtr    inMetafilePtr,
  5817.     MF3DVoidObjPtr    *outObj)
  5818. {
  5819.     MF3DPointObjPtr                returnObj;
  5820.     MF3DErr                        result;
  5821.  
  5822.     result = kMF3DNoErr;
  5823.  
  5824.     MF3D_Allocate(returnObj);
  5825.  
  5826.     if (result == kMF3DNoErr)
  5827.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->point);
  5828.  
  5829.     if (result == kMF3DNoErr)
  5830.         *outObj = (MF3DVoidObjPtr) returnObj;
  5831.     else
  5832.         MF3D_Free(returnObj);
  5833.  
  5834.     return result;
  5835. }
  5836.  
  5837.  
  5838. /*==============================================================================
  5839.  *    MF3D_ObjPointWriter
  5840.  *==============================================================================
  5841.  */
  5842. MF3DErr
  5843. MF3D_ObjPointWriter(
  5844.     MF3D_FilePtr    inMetafilePtr,
  5845.     MF3DVoidObjPtr    inObj)
  5846. {
  5847.     MF3D_VerifyObjectType(inObj, kMF3DObjPoint);
  5848.     return MF3D_Point3DWrite(inMetafilePtr,
  5849.             ((MF3DPointObjPtr)inObj)->point);
  5850. }
  5851.  
  5852. /*==============================================================================
  5853.  *    MF3D_ObjPointDisposer
  5854.  *==============================================================================
  5855.  */
  5856. MF3DErr
  5857. MF3D_ObjPointDisposer(
  5858.     MF3DVoidObjPtr    inObj)
  5859. {
  5860.     MF3D_VerifyObjectType(inObj, kMF3DObjPoint);
  5861.  
  5862.     MF3D_Free(inObj);
  5863.     return kMF3DNoErr;
  5864. }
  5865.  
  5866. /*==============================================================================
  5867.  *    MF3D_ObjPolygonReader
  5868.  *==============================================================================
  5869.  */
  5870. MF3DErr
  5871. MF3D_ObjPolygonReader(
  5872.     MF3D_FilePtr    inMetafilePtr,
  5873.     MF3DVoidObjPtr    *outObj)
  5874. {
  5875.     MF3DPolygonObjPtr            returnObj;
  5876.     MF3DUns32                    numVertices;
  5877.     MF3DErr                        result;
  5878.  
  5879.     result = kMF3DNoErr;
  5880.  
  5881.     MF3D_Allocate(returnObj);
  5882.  
  5883.     if (result == kMF3DNoErr)
  5884.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nVertices);
  5885.  
  5886.     if (result == kMF3DNoErr)
  5887.     {    numVertices = returnObj->nVertices;
  5888.         if (numVertices <= 2)
  5889.             result = kMF3DErrTooFewVertices;
  5890.     }
  5891.  
  5892.     if (result == kMF3DNoErr)
  5893.     {    MF3DPoint3DPtr    curVertexPtr;
  5894.  
  5895.         returnObj->vertices = MF3D_Malloc(numVertices *
  5896.                 sizeof(*returnObj->vertices));
  5897.         if (returnObj->vertices == NULL)
  5898.             result = kMF3DErrOutOfMemory;
  5899.  
  5900.         curVertexPtr = returnObj->vertices;
  5901.         while (result == kMF3DNoErr && numVertices > 0)
  5902.         {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  5903.             --numVertices;
  5904.             ++curVertexPtr;
  5905.         }
  5906.  
  5907.         if (result != kMF3DNoErr)
  5908.             MF3D_Free(returnObj->vertices);
  5909.     }
  5910.  
  5911.     if (result == kMF3DNoErr)
  5912.         *outObj = (MF3DVoidObjPtr) returnObj;
  5913.     else
  5914.         MF3D_Free(returnObj);
  5915.  
  5916.     return result;
  5917. }
  5918.  
  5919.  
  5920. /*==============================================================================
  5921.  *    MF3D_ObjPolygonWriter
  5922.  *==============================================================================
  5923.  */
  5924. MF3DErr
  5925. MF3D_ObjPolygonWriter(
  5926.     MF3D_FilePtr    inMetafilePtr,
  5927.     MF3DVoidObjPtr    inObj)
  5928. {
  5929.     MF3DPolygonObjPtr            writeObj;
  5930.     MF3DUns32                    numVertices;
  5931.     MF3DErr                        result;
  5932.  
  5933.     MF3D_VerifyObjectType(inObj, kMF3DObjPolygon);
  5934.     writeObj = (MF3DPolygonObjPtr)inObj;
  5935.  
  5936.     result = kMF3DNoErr;
  5937.  
  5938.     numVertices = writeObj->nVertices;
  5939.     if (numVertices <= 2)
  5940.         result = kMF3DErrTooFewVertices;
  5941.  
  5942.     if (result == kMF3DNoErr)
  5943.     {    MF3D_WriteNewLine(inMetafilePtr);
  5944.         result = MF3D_Uns32Write(inMetafilePtr, numVertices);
  5945.     }
  5946.  
  5947.     if (result == kMF3DNoErr)
  5948.     {    MF3DPoint3DPtr    curVertexPtr;
  5949.         MF3DUns32        vertexNum;
  5950.  
  5951.         MF3D_CommentStrWrite(inMetafilePtr, "nVertices");
  5952.         curVertexPtr = writeObj->vertices;
  5953.         for (vertexNum = 0;
  5954.                 result == kMF3DNoErr && vertexNum < numVertices;
  5955.                 ++vertexNum)
  5956.         {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  5957.             if (result == kMF3DNoErr)
  5958.                 MF3D_CommentNumWrite(inMetafilePtr, vertexNum);
  5959.         }
  5960.     }
  5961.  
  5962.     return result;
  5963. }
  5964.  
  5965. /*==============================================================================
  5966.  *    MF3D_ObjPolygonDisposer
  5967.  *==============================================================================
  5968.  */
  5969. MF3DErr
  5970. MF3D_ObjPolygonDisposer(
  5971.     MF3DVoidObjPtr    inObj)
  5972. {
  5973.     MF3D_VerifyObjectType(inObj, kMF3DObjPolygon);
  5974.  
  5975.     if (inObj != NULL)
  5976.     {    MF3D_Free(((MF3DPolygonObjPtr)inObj)->vertices);
  5977.         MF3D_Free(inObj);
  5978.     }
  5979.     return kMF3DNoErr;
  5980. }
  5981.  
  5982. /*==============================================================================
  5983.  *    MF3D_ObjPolyLineReader
  5984.  *==============================================================================
  5985.  */
  5986. MF3DErr
  5987. MF3D_ObjPolyLineReader(
  5988.     MF3D_FilePtr    inMetafilePtr,
  5989.     MF3DVoidObjPtr    *outObj)
  5990. {
  5991.     MF3DPolyLineObjPtr            returnObj;
  5992.     MF3DUns32                    numVertices;
  5993.     MF3DErr                        result;
  5994.  
  5995.     result = kMF3DNoErr;
  5996.  
  5997.     MF3D_Allocate(returnObj);
  5998.  
  5999.     if (result == kMF3DNoErr)
  6000.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->nVertices);
  6001.  
  6002.     if (result == kMF3DNoErr)
  6003.     {    numVertices = returnObj->nVertices;
  6004.         if (numVertices <= 2)
  6005.             result = kMF3DErrTooFewVertices;
  6006.     }
  6007.  
  6008.     if (result == kMF3DNoErr)
  6009.     {    MF3DPoint3DPtr    curVertexPtr;
  6010.  
  6011.         returnObj->vertices = MF3D_Malloc(numVertices *
  6012.                 sizeof(*returnObj->vertices));
  6013.         if (returnObj->vertices == NULL)
  6014.             result = kMF3DErrOutOfMemory;
  6015.  
  6016.         curVertexPtr = returnObj->vertices;
  6017.         while (result == kMF3DNoErr && numVertices > 0)
  6018.         {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  6019.             --numVertices;
  6020.             ++curVertexPtr;
  6021.         }
  6022.  
  6023.         if (result != kMF3DNoErr)
  6024.             MF3D_Free(returnObj->vertices);
  6025.     }
  6026.  
  6027.     if (result == kMF3DNoErr)
  6028.         *outObj = (MF3DVoidObjPtr) returnObj;
  6029.     else
  6030.         MF3D_Free(returnObj);
  6031.  
  6032.     return result;
  6033. }
  6034.  
  6035.  
  6036. /*==============================================================================
  6037.  *    MF3D_ObjPolyLineWriter
  6038.  *==============================================================================
  6039.  */
  6040. MF3DErr
  6041. MF3D_ObjPolyLineWriter(
  6042.     MF3D_FilePtr    inMetafilePtr,
  6043.     MF3DVoidObjPtr    inObj)
  6044. {
  6045.     MF3DPolyLineObjPtr            writeObj;
  6046.     MF3DUns32                    numVertices;
  6047.     MF3DErr                        result;
  6048.  
  6049.     MF3D_VerifyObjectType(inObj, kMF3DObjPolyLine);
  6050.     writeObj = (MF3DPolyLineObjPtr)inObj;
  6051.  
  6052.     result = kMF3DNoErr;
  6053.  
  6054.     numVertices = writeObj->nVertices;
  6055.     if (numVertices <= 2)
  6056.         result = kMF3DErrTooFewVertices;
  6057.  
  6058.     if (result == kMF3DNoErr)
  6059.     {    MF3D_WriteNewLine(inMetafilePtr);
  6060.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->nVertices);
  6061.     }
  6062.  
  6063.     if (result == kMF3DNoErr)
  6064.     {    MF3DPoint3DPtr    curVertexPtr;
  6065.         MF3DUns32        vertexNum;
  6066.  
  6067.         MF3D_CommentStrWrite(inMetafilePtr, "nVertices");
  6068.         curVertexPtr = writeObj->vertices;
  6069.         for (vertexNum = 0;
  6070.                 result == kMF3DNoErr && vertexNum < numVertices;
  6071.                 ++vertexNum)
  6072.         {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  6073.             if (result == kMF3DNoErr)
  6074.                 MF3D_CommentNumWrite(inMetafilePtr, vertexNum);
  6075.         }
  6076.     }
  6077.  
  6078.     return result;
  6079. }
  6080.  
  6081. /*==============================================================================
  6082.  *    MF3D_ObjPolyLineDisposer
  6083.  *==============================================================================
  6084.  */
  6085. MF3DErr
  6086. MF3D_ObjPolyLineDisposer(
  6087.     MF3DVoidObjPtr    inObj)
  6088. {
  6089.     MF3D_VerifyObjectType(inObj, kMF3DObjPolyLine);
  6090.  
  6091.     if (inObj != NULL)
  6092.     {    MF3D_Free(((MF3DPolyLineObjPtr)inObj)->vertices);
  6093.         MF3D_Free(inObj);
  6094.     }
  6095.     return kMF3DNoErr;
  6096. }
  6097.  
  6098. /*==============================================================================
  6099.  *    MF3D_ObjTorusReader
  6100.  *==============================================================================
  6101.  */
  6102. MF3DErr
  6103. MF3D_ObjTorusReader(
  6104.     MF3D_FilePtr    inMetafilePtr,
  6105.     MF3DVoidObjPtr    *outObj)
  6106. {
  6107.     MF3DTorusObjPtr                returnObj;
  6108.     MF3DVector3D                vector;
  6109.     MF3DErr                        numberExists;
  6110.     MF3DErr                        result;
  6111.  
  6112.     result = kMF3DNoErr;
  6113.  
  6114.     MF3D_Allocate(returnObj);
  6115.  
  6116.     if (result == kMF3DNoErr)
  6117.     {    returnObj->torus = NULL;
  6118.  
  6119.         numberExists = MF3D_Vector3DRead(inMetafilePtr, &vector);
  6120.     }
  6121.  
  6122.     if (result == kMF3DNoErr && numberExists == kMF3DNoErr)
  6123.     {    MF3D_Allocate(returnObj->torus);
  6124.  
  6125.         returnObj->torus->orientation.x = vector.x;
  6126.         returnObj->torus->orientation.y = vector.y;
  6127.         returnObj->torus->orientation.z = vector.z;
  6128.  
  6129.         if (result == kMF3DNoErr)
  6130.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  6131.                     &returnObj->torus->majorAxis);
  6132.         }
  6133.  
  6134.         if (result == kMF3DNoErr)
  6135.         {    result = MF3D_Vector3DRead(inMetafilePtr,
  6136.                     &returnObj->torus->minorAxis);
  6137.         }
  6138.  
  6139.         if (result == kMF3DNoErr)
  6140.             result = MF3D_Point3DRead(inMetafilePtr, &returnObj->torus->origin);
  6141.  
  6142.         if (result == kMF3DNoErr)
  6143.             result = MF3D_Float32Read(inMetafilePtr, &returnObj->torus->ratio);
  6144.     }
  6145.  
  6146.     if (result == kMF3DNoErr)
  6147.         *outObj = (MF3DVoidObjPtr) returnObj;
  6148.     else
  6149.         MF3D_Free(returnObj);
  6150.  
  6151.     return result;
  6152. }
  6153.  
  6154.  
  6155. /*==============================================================================
  6156.  *    MF3D_ObjTorusWriter
  6157.  *==============================================================================
  6158.  */
  6159. MF3DErr
  6160. MF3D_ObjTorusWriter(
  6161.     MF3D_FilePtr    inMetafilePtr,
  6162.     MF3DVoidObjPtr    inObj)
  6163. {
  6164.     MF3DTorusObjPtr                writeObj;
  6165.     MF3DErr                        result;
  6166.  
  6167.     MF3D_VerifyObjectType(inObj, kMF3DObjTorus);
  6168.     writeObj = (MF3DTorusObjPtr)inObj;
  6169.  
  6170.     result = kMF3DNoErr;
  6171.  
  6172.     if (writeObj->torus != NULL)
  6173.     {    MF3D_WriteNewLine(inMetafilePtr);
  6174.         result = MF3D_Vector3DWrite(inMetafilePtr,
  6175.                 writeObj->torus->orientation);
  6176.  
  6177.         if (result == kMF3DNoErr)
  6178.         {    MF3D_WriteNewLine(inMetafilePtr);
  6179.             result = MF3D_Vector3DWrite(inMetafilePtr,
  6180.                     writeObj->torus->majorAxis);
  6181.         }
  6182.  
  6183.         if (result == kMF3DNoErr)
  6184.         {    MF3D_WriteNewLine(inMetafilePtr);
  6185.             result = MF3D_Vector3DWrite(inMetafilePtr,
  6186.                     writeObj->torus->minorAxis);
  6187.         }
  6188.  
  6189.         if (result == kMF3DNoErr)
  6190.         {    MF3D_WriteNewLine(inMetafilePtr);
  6191.             result = MF3D_Point3DWrite(inMetafilePtr,
  6192.                     writeObj->torus->origin);
  6193.         }
  6194.  
  6195.         if (result == kMF3DNoErr)
  6196.         {    MF3D_WriteNewLine(inMetafilePtr);
  6197.             result = MF3D_Float32Write(inMetafilePtr,
  6198.                     writeObj->torus->ratio);
  6199.         }
  6200.  
  6201.         if (result == kMF3DNoErr)
  6202.             MF3D_WriteNewLine(inMetafilePtr);
  6203.     }
  6204.  
  6205.     return result;
  6206. }
  6207.  
  6208. /*==============================================================================
  6209.  *    MF3D_ObjTorusDisposer
  6210.  *==============================================================================
  6211.  */
  6212. MF3DErr
  6213. MF3D_ObjTorusDisposer(
  6214.     MF3DVoidObjPtr    inObj)
  6215. {
  6216.     MF3D_VerifyObjectType(inObj, kMF3DObjTorus);
  6217.  
  6218.     if (inObj != NULL)
  6219.     {    MF3D_Free(((MF3DTorusObjPtr)inObj)->torus);
  6220.         MF3D_Free(inObj);
  6221.     }
  6222.  
  6223.     return kMF3DNoErr;
  6224. }
  6225.  
  6226. /*==============================================================================
  6227.  *    MF3D_ObjTriangleReader
  6228.  *==============================================================================
  6229.  */
  6230. MF3DErr
  6231. MF3D_ObjTriangleReader(
  6232.     MF3D_FilePtr    inMetafilePtr,
  6233.     MF3DVoidObjPtr    *outObj)
  6234. {
  6235.     MF3DTriangleObjPtr            returnObj;
  6236.     MF3DErr                        result;
  6237.  
  6238.     result = kMF3DNoErr;
  6239.  
  6240.     MF3D_Allocate(returnObj);
  6241.  
  6242.     if (result == kMF3DNoErr)
  6243.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->vertex1);
  6244.  
  6245.     if (result == kMF3DNoErr)
  6246.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->vertex2);
  6247.  
  6248.     if (result == kMF3DNoErr)
  6249.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->vertex3);
  6250.  
  6251.     if (result == kMF3DNoErr)
  6252.         *outObj = (MF3DVoidObjPtr) returnObj;
  6253.     else
  6254.         MF3D_Free(returnObj);
  6255.  
  6256.     return result;
  6257. }
  6258.  
  6259.  
  6260. /*==============================================================================
  6261.  *    MF3D_ObjTriangleWriter
  6262.  *==============================================================================
  6263.  */
  6264. MF3DErr
  6265. MF3D_ObjTriangleWriter(
  6266.     MF3D_FilePtr    inMetafilePtr,
  6267.     MF3DVoidObjPtr    inObj)
  6268. {
  6269.     MF3DTriangleObjPtr            writeObj;
  6270.     MF3DErr                        result;
  6271.  
  6272.     MF3D_VerifyObjectType(inObj, kMF3DObjTriangle);
  6273.     writeObj = (MF3DTriangleObjPtr)inObj;
  6274.  
  6275.     MF3D_WriteNewLine(inMetafilePtr);
  6276.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->vertex1);
  6277.  
  6278.     if (result == kMF3DNoErr)
  6279.     {    MF3D_WriteNewLine(inMetafilePtr);
  6280.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->vertex2);
  6281.     }
  6282.  
  6283.     if (result == kMF3DNoErr)
  6284.     {    MF3D_WriteNewLine(inMetafilePtr);
  6285.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->vertex3);
  6286.     }
  6287.  
  6288.     if (result == kMF3DNoErr)
  6289.         MF3D_WriteNewLine(inMetafilePtr);
  6290.  
  6291.     return result;
  6292. }
  6293.  
  6294. /*==============================================================================
  6295.  *    MF3D_ObjTriangleDisposer
  6296.  *==============================================================================
  6297.  */
  6298. MF3DErr
  6299. MF3D_ObjTriangleDisposer(
  6300.     MF3DVoidObjPtr    inObj)
  6301. {
  6302.     MF3D_VerifyObjectType(inObj, kMF3DObjTriangle);
  6303.  
  6304.     MF3D_Free(inObj);
  6305.     return kMF3DNoErr;
  6306. }
  6307.  
  6308. /*==============================================================================
  6309.  *    MF3D_ObjTriGridReader
  6310.  *==============================================================================
  6311.  */
  6312. MF3DErr
  6313. MF3D_ObjTriGridReader(
  6314.     MF3D_FilePtr    inMetafilePtr,
  6315.     MF3DVoidObjPtr    *outObj)
  6316. {
  6317.     MF3DTriGridObjPtr            returnObj;
  6318.     MF3DUns32                    numRows, numColumns;
  6319.     MF3DUns32                    numVertices;
  6320.     MF3DErr                        result;
  6321.  
  6322.     result = kMF3DNoErr;
  6323.  
  6324.     MF3D_Allocate(returnObj);
  6325.  
  6326.     if (result == kMF3DNoErr)
  6327.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->numRows);
  6328.     if (result == kMF3DNoErr)
  6329.     {    numRows = returnObj->numRows;
  6330.         if (numRows < 2)
  6331.             result = kMF3DErrTooFewVertices;
  6332.     }
  6333.  
  6334.     if (result == kMF3DNoErr)
  6335.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->numColumns);
  6336.     if (result == kMF3DNoErr)
  6337.     {    numColumns = returnObj->numColumns;
  6338.         if (numColumns < 2)
  6339.             result = kMF3DErrTooFewVertices;
  6340.     }
  6341.  
  6342.     if (result == kMF3DNoErr)
  6343.     {    MF3DPoint3DPtr        curVertexPtr;
  6344.  
  6345.         numVertices = numColumns * numRows;
  6346.  
  6347.         returnObj->vertices = MF3D_Malloc(numVertices *
  6348.                 sizeof(*returnObj->vertices));
  6349.         if (returnObj->vertices == NULL)
  6350.             result = kMF3DErrOutOfMemory;
  6351.  
  6352.         curVertexPtr = returnObj->vertices;
  6353.         while (result == kMF3DNoErr && numVertices > 0)
  6354.         {    result = MF3D_Point3DRead(inMetafilePtr, curVertexPtr);
  6355.             --numVertices;
  6356.             ++curVertexPtr;
  6357.         }
  6358.  
  6359.         if (result != kMF3DNoErr)
  6360.         {    MF3D_Free(returnObj->vertices);
  6361.         }
  6362.     }
  6363.  
  6364.     if (result == kMF3DNoErr)
  6365.         *outObj = (MF3DVoidObjPtr) returnObj;
  6366.     else
  6367.         MF3D_Free(returnObj);
  6368.  
  6369.     return result;
  6370. }
  6371.  
  6372.  
  6373. /*==============================================================================
  6374.  *    MF3D_ObjTriGridWriter
  6375.  *==============================================================================
  6376.  */
  6377. MF3DErr
  6378. MF3D_ObjTriGridWriter(
  6379.     MF3D_FilePtr    inMetafilePtr,
  6380.     MF3DVoidObjPtr    inObj)
  6381. {
  6382.     MF3DTriGridObjPtr            writeObj;
  6383.     MF3DUns32                    numRows, numColumns;
  6384.     MF3DUns32                    numVertices;
  6385.     MF3DErr                        result;
  6386.  
  6387.     MF3D_VerifyObjectType(inObj, kMF3DObjTriGrid);
  6388.     writeObj = (MF3DTriGridObjPtr)inObj;
  6389.  
  6390.     result = kMF3DNoErr;
  6391.  
  6392.     numRows = writeObj->numRows;
  6393.     if (numRows < 2)
  6394.         result = kMF3DErrTooFewVertices;
  6395.  
  6396.     if (result == kMF3DNoErr)
  6397.     {    numColumns = writeObj->numColumns;
  6398.         if (numColumns < 2)
  6399.             result = kMF3DErrTooFewVertices;
  6400.     }
  6401.  
  6402.     if (result == kMF3DNoErr)
  6403.     {    MF3D_CommentStrWrite(inMetafilePtr, "numRows");
  6404.         result = MF3D_Uns32Write(inMetafilePtr, numRows);
  6405.     }
  6406.  
  6407.     if (result == kMF3DNoErr)
  6408.         result = MF3D_Uns32Write(inMetafilePtr, numColumns);
  6409.  
  6410.     if (result == kMF3DNoErr)
  6411.     {    MF3DPoint3DPtr        curVertexPtr;
  6412.         MF3DUns32            vertexNum;
  6413.  
  6414.         numVertices = numColumns * numRows;
  6415.  
  6416.         MF3D_CommentStrWrite(inMetafilePtr, "numColumns");
  6417.  
  6418.         curVertexPtr = writeObj->vertices;
  6419.         for (vertexNum = 0;
  6420.                 result == kMF3DNoErr && vertexNum < numVertices;
  6421.                 ++vertexNum)
  6422.         {    result = MF3D_Point3DWrite(inMetafilePtr, *curVertexPtr++);
  6423.             if (result == kMF3DNoErr)
  6424.                 MF3D_CommentNumWrite(inMetafilePtr, vertexNum);
  6425.         }
  6426.     }
  6427.  
  6428.     return result;
  6429. }
  6430.  
  6431. /*==============================================================================
  6432.  *    MF3D_ObjTriGridDisposer
  6433.  *==============================================================================
  6434.  */
  6435. MF3DErr
  6436. MF3D_ObjTriGridDisposer(
  6437.     MF3DVoidObjPtr    inObj)
  6438. {
  6439.     MF3D_VerifyObjectType(inObj, kMF3DObjTriGrid);
  6440.  
  6441.     if (inObj != NULL)
  6442.     {    MF3D_Free(((MF3DTriGridObjPtr)inObj)->vertices);
  6443.         MF3D_Free(inObj);
  6444.     }
  6445.     return kMF3DNoErr;
  6446. }
  6447.  
  6448. /*==============================================================================
  6449.  *    MF3D_ObjGroupReader
  6450.  *==============================================================================
  6451.  */
  6452. MF3DErr
  6453. MF3D_ObjGroupReader(
  6454.     MF3D_FilePtr    inMetafilePtr,
  6455.     MF3DVoidObjPtr    *outObj)
  6456. {
  6457.     MF3DGroupObjPtr                returnObj;
  6458.     MF3DErr                        result;
  6459.  
  6460.     MF3D_Unused(inMetafilePtr);
  6461.  
  6462.     result = kMF3DNoErr;
  6463.  
  6464.     MF3D_Allocate(returnObj);
  6465.  
  6466.     if (result == kMF3DNoErr)
  6467.         *outObj = (MF3DVoidObjPtr) returnObj;
  6468.     else
  6469.         MF3D_Free(returnObj);
  6470.  
  6471.     return result;
  6472. }
  6473.  
  6474. /*==============================================================================
  6475.  *    MF3D_ObjGroupWriter
  6476.  *==============================================================================
  6477.  */
  6478. MF3DErr
  6479. MF3D_ObjGroupWriter(
  6480.     MF3D_FilePtr    inMetafilePtr,
  6481.     MF3DVoidObjPtr    inObj)
  6482. {
  6483.     MF3D_VerifyObjectType(inObj, kMF3DObjGroup);
  6484.     MF3D_Unused(inMetafilePtr);
  6485.     MF3D_Unused(inObj);
  6486.     /* Nothing to write! */
  6487.     return kMF3DNoErr;
  6488. }
  6489.  
  6490. /*==============================================================================
  6491.  *    MF3D_ObjGroupDisposer
  6492.  *==============================================================================
  6493.  */
  6494. MF3DErr
  6495. MF3D_ObjGroupDisposer(
  6496.     MF3DVoidObjPtr    inObj)
  6497. {
  6498.     MF3D_VerifyObjectType(inObj, kMF3DObjGroup);
  6499.  
  6500.     MF3D_Free(inObj);
  6501.     return kMF3DNoErr;
  6502. }
  6503.  
  6504. /*==============================================================================
  6505.  *    MF3D_ObjDisplayGroupReader
  6506.  *==============================================================================
  6507.  */
  6508. MF3DErr
  6509. MF3D_ObjDisplayGroupReader(
  6510.     MF3D_FilePtr    inMetafilePtr,
  6511.     MF3DVoidObjPtr    *outObj)
  6512. {
  6513.     MF3DDisplayGroupObjPtr        returnObj;
  6514.     MF3DErr                        result;
  6515.  
  6516.     MF3D_Unused(inMetafilePtr);
  6517.  
  6518.     result = kMF3DNoErr;
  6519.  
  6520.     MF3D_Allocate(returnObj);
  6521.  
  6522.     if (result == kMF3DNoErr)
  6523.         *outObj = (MF3DVoidObjPtr) returnObj;
  6524.     else
  6525.         MF3D_Free(returnObj);
  6526.  
  6527.     return result;
  6528. }
  6529.  
  6530.  
  6531. /*==============================================================================
  6532.  *    MF3D_ObjDisplayGroupWriter
  6533.  *==============================================================================
  6534.  */
  6535. MF3DErr
  6536. MF3D_ObjDisplayGroupWriter(
  6537.     MF3D_FilePtr    inMetafilePtr,
  6538.     MF3DVoidObjPtr    inObj)
  6539. {
  6540.     MF3D_VerifyObjectType(inObj, kMF3DObjDisplayGroup);
  6541.     MF3D_Unused(inMetafilePtr);
  6542.     MF3D_Unused(inObj);
  6543.     /* Nothing to write! */
  6544.     return kMF3DNoErr;
  6545. }
  6546.  
  6547. /*==============================================================================
  6548.  *    MF3D_ObjDisplayGroupDisposer
  6549.  *==============================================================================
  6550.  */
  6551. MF3DErr
  6552. MF3D_ObjDisplayGroupDisposer(
  6553.     MF3DVoidObjPtr    inObj)
  6554. {
  6555.     MF3D_VerifyObjectType(inObj, kMF3DObjDisplayGroup);
  6556.  
  6557.     MF3D_Free(inObj);
  6558.     return kMF3DNoErr;
  6559. }
  6560.  
  6561. /*==============================================================================
  6562.  *    MF3D_ObjIOProxyDisplayGroupReader
  6563.  *==============================================================================
  6564.  */
  6565. MF3DErr
  6566. MF3D_ObjIOProxyDisplayGroupReader(
  6567.     MF3D_FilePtr    inMetafilePtr,
  6568.     MF3DVoidObjPtr    *outObj)
  6569. {
  6570.     MF3DIOProxyDisplayGroupObjPtr    returnObj;
  6571.     MF3DErr                        result;
  6572.  
  6573.     MF3D_Unused(inMetafilePtr);
  6574.  
  6575.     result = kMF3DNoErr;
  6576.  
  6577.     MF3D_Allocate(returnObj);
  6578.  
  6579.     if (result == kMF3DNoErr)
  6580.         *outObj = (MF3DVoidObjPtr) returnObj;
  6581.     else
  6582.         MF3D_Free(returnObj);
  6583.  
  6584.     return result;
  6585. }
  6586.  
  6587.  
  6588. /*==============================================================================
  6589.  *    MF3D_ObjIOProxyDisplayGroupWriter
  6590.  *==============================================================================
  6591.  */
  6592. MF3DErr
  6593. MF3D_ObjIOProxyDisplayGroupWriter(
  6594.     MF3D_FilePtr    inMetafilePtr,
  6595.     MF3DVoidObjPtr    inObj)
  6596. {
  6597.     MF3D_VerifyObjectType(inObj, kMF3DObjIOProxyDisplayGroup);
  6598.     MF3D_Unused(inMetafilePtr);
  6599.     MF3D_Unused(inObj);
  6600.     /* Nothing to write! */
  6601.     return kMF3DNoErr;
  6602. }
  6603.  
  6604. /*==============================================================================
  6605.  *    MF3D_ObjIOProxyDisplayGroupDisposer
  6606.  *==============================================================================
  6607.  */
  6608. MF3DErr
  6609. MF3D_ObjIOProxyDisplayGroupDisposer(
  6610.     MF3DVoidObjPtr    inObj)
  6611. {
  6612.     MF3D_VerifyObjectType(inObj, kMF3DObjIOProxyDisplayGroup);
  6613.  
  6614.     MF3D_Free(inObj);
  6615.     return kMF3DNoErr;
  6616. }
  6617.  
  6618. /*==============================================================================
  6619.  *    MF3D_ObjOrderedDisplayGroupReader
  6620.  *==============================================================================
  6621.  */
  6622. MF3DErr
  6623. MF3D_ObjOrderedDisplayGroupReader(
  6624.     MF3D_FilePtr    inMetafilePtr,
  6625.     MF3DVoidObjPtr    *outObj)
  6626. {
  6627.     MF3DOrderedDisplayGroupObjPtr    returnObj;
  6628.     MF3DErr                        result;
  6629.  
  6630.     MF3D_Unused(inMetafilePtr);
  6631.  
  6632.     result = kMF3DNoErr;
  6633.  
  6634.     MF3D_Allocate(returnObj);
  6635.  
  6636.     if (result == kMF3DNoErr)
  6637.         *outObj = (MF3DVoidObjPtr) returnObj;
  6638.     else
  6639.         MF3D_Free(returnObj);
  6640.  
  6641.     return result;
  6642. }
  6643.  
  6644. /*==============================================================================
  6645.  *    MF3D_ObjOrderedDisplayGroupWriter
  6646.  *==============================================================================
  6647.  */
  6648. MF3DErr
  6649. MF3D_ObjOrderedDisplayGroupWriter(
  6650.     MF3D_FilePtr    inMetafilePtr,
  6651.     MF3DVoidObjPtr    inObj)
  6652. {
  6653.     MF3D_VerifyObjectType(inObj, kMF3DObjOrderedDisplayGroup);
  6654.     MF3D_Unused(inMetafilePtr);
  6655.     MF3D_Unused(inObj);
  6656.     /* Nothing to write! */
  6657.     return kMF3DNoErr;
  6658. }
  6659.  
  6660. /*==============================================================================
  6661.  *    MF3D_ObjOrderedDisplayGroupDisposer
  6662.  *==============================================================================
  6663.  */
  6664. MF3DErr
  6665. MF3D_ObjOrderedDisplayGroupDisposer(
  6666.     MF3DVoidObjPtr    inObj)
  6667. {
  6668.     MF3D_VerifyObjectType(inObj, kMF3DObjOrderedDisplayGroup);
  6669.  
  6670.     MF3D_Free(inObj);
  6671.     return kMF3DNoErr;
  6672. }
  6673.  
  6674. /*==============================================================================
  6675.  *    MF3D_ObjInfoGroupReader
  6676.  *==============================================================================
  6677.  */
  6678. MF3DErr
  6679. MF3D_ObjInfoGroupReader(
  6680.     MF3D_FilePtr    inMetafilePtr,
  6681.     MF3DVoidObjPtr    *outObj)
  6682. {
  6683.     MF3DInfoGroupObjPtr            returnObj;
  6684.     MF3DErr                        result;
  6685.  
  6686.     MF3D_Unused(inMetafilePtr);
  6687.  
  6688.     result = kMF3DNoErr;
  6689.  
  6690.     MF3D_Allocate(returnObj);
  6691.  
  6692.     if (result == kMF3DNoErr)
  6693.         *outObj = (MF3DVoidObjPtr) returnObj;
  6694.     else
  6695.         MF3D_Free(returnObj);
  6696.  
  6697.     return result;
  6698. }
  6699.  
  6700. /*==============================================================================
  6701.  *    MF3D_ObjInfoGroupWriter
  6702.  *==============================================================================
  6703.  */
  6704. MF3DErr
  6705. MF3D_ObjInfoGroupWriter(
  6706.     MF3D_FilePtr    inMetafilePtr,
  6707.     MF3DVoidObjPtr    inObj)
  6708. {
  6709.     MF3D_VerifyObjectType(inObj, kMF3DObjInfoGroup);
  6710.     MF3D_Unused(inMetafilePtr);
  6711.     MF3D_Unused(inObj);
  6712.     /* Nothing to write! */
  6713.     return kMF3DNoErr;
  6714. }
  6715.  
  6716. /*==============================================================================
  6717.  *    MF3D_ObjInfoGroupDisposer
  6718.  *==============================================================================
  6719.  */
  6720. MF3DErr
  6721. MF3D_ObjInfoGroupDisposer(
  6722.     MF3DVoidObjPtr    inObj)
  6723. {
  6724.     MF3D_VerifyObjectType(inObj, kMF3DObjInfoGroup);
  6725.  
  6726.     MF3D_Free(inObj);
  6727.     return kMF3DNoErr;
  6728. }
  6729.  
  6730. /*==============================================================================
  6731.  *    MF3D_ObjLightGroupReader
  6732.  *==============================================================================
  6733.  */
  6734. MF3DErr
  6735. MF3D_ObjLightGroupReader(
  6736.     MF3D_FilePtr    inMetafilePtr,
  6737.     MF3DVoidObjPtr    *outObj)
  6738. {
  6739.     MF3DLightGroupObjPtr        returnObj;
  6740.     MF3DErr                        result;
  6741.  
  6742.     MF3D_Unused(inMetafilePtr);
  6743.  
  6744.     result = kMF3DNoErr;
  6745.  
  6746.     MF3D_Allocate(returnObj);
  6747.  
  6748.     if (result == kMF3DNoErr)
  6749.         *outObj = (MF3DVoidObjPtr) returnObj;
  6750.     else
  6751.         MF3D_Free(returnObj);
  6752.  
  6753.     return result;
  6754. }
  6755.  
  6756. /*==============================================================================
  6757.  *    MF3D_ObjLightGroupWriter
  6758.  *==============================================================================
  6759.  */
  6760. MF3DErr
  6761. MF3D_ObjLightGroupWriter(
  6762.     MF3D_FilePtr    inMetafilePtr,
  6763.     MF3DVoidObjPtr    inObj)
  6764. {
  6765.     MF3D_VerifyObjectType(inObj, kMF3DObjLightGroup);
  6766.     MF3D_Unused(inMetafilePtr);
  6767.     MF3D_Unused(inObj);
  6768.     /* Nothing to write! */
  6769.     return kMF3DNoErr;
  6770. }
  6771.  
  6772. /*==============================================================================
  6773.  *    MF3D_ObjLightGroupDisposer
  6774.  *==============================================================================
  6775.  */
  6776. MF3DErr
  6777. MF3D_ObjLightGroupDisposer(
  6778.     MF3DVoidObjPtr    inObj)
  6779. {
  6780.     MF3D_VerifyObjectType(inObj, kMF3DObjLightGroup);
  6781.  
  6782.     MF3D_Free(inObj);
  6783.     return kMF3DNoErr;
  6784. }
  6785.  
  6786. /*==============================================================================
  6787.  *    MF3D_ObjAmbientLightReader
  6788.  *==============================================================================
  6789.  */
  6790. MF3DErr
  6791. MF3D_ObjAmbientLightReader(
  6792.     MF3D_FilePtr    inMetafilePtr,
  6793.     MF3DVoidObjPtr    *outObj)
  6794. {
  6795.     MF3DAmbientLightObjPtr        returnObj;
  6796.     MF3DErr                        result;
  6797.  
  6798.     MF3D_Unused(inMetafilePtr);
  6799.     result = kMF3DNoErr;
  6800.  
  6801.     MF3D_Allocate(returnObj);
  6802.  
  6803.     if (result == kMF3DNoErr)
  6804.         *outObj = (MF3DVoidObjPtr) returnObj;
  6805.     else
  6806.         MF3D_Free(returnObj);
  6807.  
  6808.     return result;
  6809. }
  6810.  
  6811. /*==============================================================================
  6812.  *    MF3D_ObjAmbientLightWriter
  6813.  *==============================================================================
  6814.  */
  6815. MF3DErr
  6816. MF3D_ObjAmbientLightWriter(
  6817.     MF3D_FilePtr    inMetafilePtr,
  6818.     MF3DVoidObjPtr    inObj)
  6819. {
  6820.     MF3D_VerifyObjectType(inObj, kMF3DObjAmbientLight);
  6821.     MF3D_Unused(inMetafilePtr);
  6822.     MF3D_Unused(inObj);
  6823.     /* Nothing to write! */
  6824.     return kMF3DNoErr;
  6825. }
  6826.  
  6827. /*==============================================================================
  6828.  *    MF3D_ObjAmbientLightDisposer
  6829.  *==============================================================================
  6830.  */
  6831. MF3DErr
  6832. MF3D_ObjAmbientLightDisposer(
  6833.     MF3DVoidObjPtr    inObj)
  6834. {
  6835.     MF3D_VerifyObjectType(inObj, kMF3DObjAmbientLight);
  6836.  
  6837.     MF3D_Free(inObj);
  6838.     return kMF3DNoErr;
  6839. }
  6840.  
  6841. /*==============================================================================
  6842.  *    MF3D_ObjDirectionalLightReader
  6843.  *==============================================================================
  6844.  */
  6845. MF3DErr
  6846. MF3D_ObjDirectionalLightReader(
  6847.     MF3D_FilePtr    inMetafilePtr,
  6848.     MF3DVoidObjPtr    *outObj)
  6849. {
  6850.     MF3DDirectionalLightObjPtr    returnObj;
  6851.     MF3DErr                        result;
  6852.  
  6853.     result = kMF3DNoErr;
  6854.  
  6855.     MF3D_Allocate(returnObj);
  6856.  
  6857.     if (result == kMF3DNoErr)
  6858.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->direction);
  6859.  
  6860.     if (result == kMF3DNoErr)
  6861.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->castsShadows);
  6862.  
  6863.     if (result == kMF3DNoErr)
  6864.         *outObj = (MF3DVoidObjPtr) returnObj;
  6865.     else
  6866.         MF3D_Free(returnObj);
  6867.  
  6868.     return result;
  6869. }
  6870.  
  6871. /*==============================================================================
  6872.  *    MF3D_ObjDirectionalLightWriter
  6873.  *==============================================================================
  6874.  */
  6875. MF3DErr
  6876. MF3D_ObjDirectionalLightWriter(
  6877.     MF3D_FilePtr    inMetafilePtr,
  6878.     MF3DVoidObjPtr    inObj)
  6879. {
  6880.     MF3DDirectionalLightObjPtr    writeObj;
  6881.     MF3DErr                        result;
  6882.  
  6883.     MF3D_VerifyObjectType(inObj, kMF3DObjDirectionalLight);
  6884.     writeObj = (MF3DDirectionalLightObjPtr)inObj;
  6885.  
  6886.     result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->direction);
  6887.  
  6888.     if (result == kMF3DNoErr)
  6889.         result = MF3D_BooleanWrite(inMetafilePtr, writeObj->castsShadows);
  6890.  
  6891.     return result;
  6892. }
  6893.  
  6894. /*==============================================================================
  6895.  *    MF3D_ObjDirectionalLightDisposer
  6896.  *==============================================================================
  6897.  */
  6898. MF3DErr
  6899. MF3D_ObjDirectionalLightDisposer(
  6900.     MF3DVoidObjPtr    inObj)
  6901. {
  6902.     MF3D_VerifyObjectType(inObj, kMF3DObjDirectionalLight);
  6903.  
  6904.     MF3D_Free(inObj);
  6905.     return kMF3DNoErr;
  6906. }
  6907.  
  6908. /*==============================================================================
  6909.  *    MF3D_ObjPointLightReader
  6910.  *==============================================================================
  6911.  */
  6912. MF3DErr
  6913. MF3D_ObjPointLightReader(
  6914.     MF3D_FilePtr    inMetafilePtr,
  6915.     MF3DVoidObjPtr    *outObj)
  6916. {
  6917.     MF3DPointLightObjPtr        returnObj;
  6918.     MF3DErr                        result;
  6919.  
  6920.     result = kMF3DNoErr;
  6921.  
  6922.     MF3D_Allocate(returnObj);
  6923.  
  6924.     if (result == kMF3DNoErr)
  6925.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->location);
  6926.  
  6927.     if (result == kMF3DNoErr)
  6928.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c0);
  6929.  
  6930.     if (result == kMF3DNoErr)
  6931.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c1);
  6932.  
  6933.     if (result == kMF3DNoErr)
  6934.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c2);
  6935.  
  6936.     if (result == kMF3DNoErr)
  6937.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->castsShadows);
  6938.  
  6939.     if (result == kMF3DNoErr)
  6940.         *outObj = (MF3DVoidObjPtr) returnObj;
  6941.     else
  6942.         MF3D_Free(returnObj);
  6943.  
  6944.     return result;
  6945. }
  6946.  
  6947. /*==============================================================================
  6948.  *    MF3D_ObjPointLightWriter
  6949.  *==============================================================================
  6950.  */
  6951. MF3DErr
  6952. MF3D_ObjPointLightWriter(
  6953.     MF3D_FilePtr    inMetafilePtr,
  6954.     MF3DVoidObjPtr    inObj)
  6955. {
  6956.     MF3DPointLightObjPtr        writeObj;
  6957.     MF3DErr                        result;
  6958.  
  6959.     MF3D_VerifyObjectType(inObj, kMF3DObjPointLight);
  6960.     writeObj = (MF3DPointLightObjPtr)inObj;
  6961.  
  6962.     result = kMF3DNoErr;
  6963.  
  6964.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->location);
  6965.  
  6966.     if (result == kMF3DNoErr)
  6967.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c0);
  6968.  
  6969.     if (result == kMF3DNoErr)
  6970.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c1);
  6971.  
  6972.     if (result == kMF3DNoErr)
  6973.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c2);
  6974.  
  6975.     if (result == kMF3DNoErr)
  6976.         result = MF3D_BooleanWrite(inMetafilePtr, writeObj->castsShadows);
  6977.  
  6978.     return result;
  6979. }
  6980.  
  6981. /*==============================================================================
  6982.  *    MF3D_ObjPointLightDisposer
  6983.  *==============================================================================
  6984.  */
  6985. MF3DErr
  6986. MF3D_ObjPointLightDisposer(
  6987.     MF3DVoidObjPtr    inObj)
  6988. {
  6989.     MF3D_VerifyObjectType(inObj, kMF3DObjPointLight);
  6990.  
  6991.     MF3D_Free(inObj);
  6992.     return kMF3DNoErr;
  6993. }
  6994.  
  6995. /*==============================================================================
  6996.  *    MF3D_ObjSpotLightReader
  6997.  *==============================================================================
  6998.  */
  6999. MF3DErr
  7000. MF3D_ObjSpotLightReader(
  7001.     MF3D_FilePtr    inMetafilePtr,
  7002.     MF3DVoidObjPtr    *outObj)
  7003. {
  7004.     MF3DSpotLightObjPtr            returnObj;
  7005.     MF3DErr                        result;
  7006.  
  7007.     result = kMF3DNoErr;
  7008.  
  7009.     MF3D_Allocate(returnObj);
  7010.  
  7011.     if (result == kMF3DNoErr)
  7012.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->location);
  7013.  
  7014.     if (result == kMF3DNoErr)
  7015.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->orientation);
  7016.  
  7017.     if (result == kMF3DNoErr)
  7018.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->castsShadows);
  7019.  
  7020.     if (result == kMF3DNoErr)
  7021.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c0);
  7022.  
  7023.     if (result == kMF3DNoErr)
  7024.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c1);
  7025.  
  7026.     if (result == kMF3DNoErr)
  7027.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->attenuation.c2);
  7028.  
  7029.     if (result == kMF3DNoErr)
  7030.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->hotAngle);
  7031.  
  7032.     if (result == kMF3DNoErr)
  7033.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->outerAngle);
  7034.  
  7035.     if (result == kMF3DNoErr)
  7036.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_FallOffEnum,
  7037.                 &returnObj->fallOff);
  7038.     }
  7039.  
  7040.     if (result == kMF3DNoErr)
  7041.         *outObj = (MF3DVoidObjPtr) returnObj;
  7042.     else
  7043.         MF3D_Free(returnObj);
  7044.  
  7045.     return result;
  7046. }
  7047.  
  7048. /*==============================================================================
  7049.  *    MF3D_ObjSpotLightWriter
  7050.  *==============================================================================
  7051.  */
  7052. MF3DErr
  7053. MF3D_ObjSpotLightWriter(
  7054.     MF3D_FilePtr    inMetafilePtr,
  7055.     MF3DVoidObjPtr    inObj)
  7056. {
  7057.     MF3DSpotLightObjPtr            writeObj;
  7058.     MF3DErr                        result;
  7059.  
  7060.     MF3D_VerifyObjectType(inObj, kMF3DObjSpotLight);
  7061.     writeObj = (MF3DSpotLightObjPtr)inObj;
  7062.  
  7063.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->location);
  7064.  
  7065.     if (result == kMF3DNoErr)
  7066.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->orientation);
  7067.  
  7068.     if (result == kMF3DNoErr)
  7069.         result = MF3D_BooleanWrite(inMetafilePtr, writeObj->castsShadows);
  7070.  
  7071.     if (result == kMF3DNoErr)
  7072.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c0);
  7073.  
  7074.     if (result == kMF3DNoErr)
  7075.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c1);
  7076.  
  7077.     if (result == kMF3DNoErr)
  7078.         result = MF3D_Float32Write(inMetafilePtr, writeObj->attenuation.c2);
  7079.  
  7080.     if (result == kMF3DNoErr)
  7081.         result = MF3D_Float32Write(inMetafilePtr, writeObj->hotAngle);
  7082.  
  7083.     if (result == kMF3DNoErr)
  7084.         result = MF3D_Float32Write(inMetafilePtr, writeObj->outerAngle);
  7085.  
  7086.     if (result == kMF3DNoErr)
  7087.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_FallOffEnum,
  7088.                 writeObj->fallOff);
  7089.     }
  7090.  
  7091.     return result;
  7092. }
  7093.  
  7094. /*==============================================================================
  7095.  *    MF3D_ObjSpotLightDisposer
  7096.  *==============================================================================
  7097.  */
  7098. MF3DErr
  7099. MF3D_ObjSpotLightDisposer(
  7100.     MF3DVoidObjPtr    inObj)
  7101. {
  7102.     MF3D_VerifyObjectType(inObj, kMF3DObjSpotLight);
  7103.  
  7104.     MF3D_Free(inObj);
  7105.     return kMF3DNoErr;
  7106. }
  7107.  
  7108. /*==============================================================================
  7109.  *    MF3D_ObjLambertIlluminationReader
  7110.  *==============================================================================
  7111.  */
  7112. MF3DErr
  7113. MF3D_ObjLambertIlluminationReader(
  7114.     MF3D_FilePtr    inMetafilePtr,
  7115.     MF3DVoidObjPtr    *outObj)
  7116. {
  7117.     MF3DLambertIlluminationObjPtr    returnObj;
  7118.     MF3DErr                        result;
  7119.  
  7120.     MF3D_Unused(inMetafilePtr);
  7121.     result = kMF3DNoErr;
  7122.  
  7123.     MF3D_Allocate(returnObj);
  7124.  
  7125.     if (result == kMF3DNoErr)
  7126.         *outObj = (MF3DVoidObjPtr) returnObj;
  7127.     else
  7128.         MF3D_Free(returnObj);
  7129.  
  7130.     return result;
  7131. }
  7132.  
  7133. /*==============================================================================
  7134.  *    MF3D_ObjLambertIlluminationWriter
  7135.  *==============================================================================
  7136.  */
  7137. MF3DErr
  7138. MF3D_ObjLambertIlluminationWriter(
  7139.     MF3D_FilePtr    inMetafilePtr,
  7140.     MF3DVoidObjPtr    inObj)
  7141. {
  7142.     MF3D_VerifyObjectType(inObj, kMF3DObjLambertIllumination);
  7143.     MF3D_Unused(inMetafilePtr);
  7144.     MF3D_Unused(inObj);
  7145.     /* Nothing to write! */
  7146.     return kMF3DNoErr;
  7147. }
  7148.  
  7149. /*==============================================================================
  7150.  *    MF3D_ObjLambertIlluminationDisposer
  7151.  *==============================================================================
  7152.  */
  7153. MF3DErr
  7154. MF3D_ObjLambertIlluminationDisposer(
  7155.     MF3DVoidObjPtr    inObj)
  7156. {
  7157.     MF3D_VerifyObjectType(inObj, kMF3DObjLambertIllumination);
  7158.  
  7159.     MF3D_Free(inObj);
  7160.     return kMF3DNoErr;
  7161. }
  7162.  
  7163. /*==============================================================================
  7164.  *    MF3D_ObjPhongIlluminationReader
  7165.  *==============================================================================
  7166.  */
  7167. MF3DErr
  7168. MF3D_ObjPhongIlluminationReader(
  7169.     MF3D_FilePtr    inMetafilePtr,
  7170.     MF3DVoidObjPtr    *outObj)
  7171. {
  7172.     MF3DPhongIlluminationObjPtr    returnObj;
  7173.     MF3DErr                        result;
  7174.  
  7175.     MF3D_Unused(inMetafilePtr);
  7176.     result = kMF3DNoErr;
  7177.  
  7178.     MF3D_Allocate(returnObj);
  7179.  
  7180.     if (result == kMF3DNoErr)
  7181.         *outObj = (MF3DVoidObjPtr) returnObj;
  7182.     else
  7183.         MF3D_Free(returnObj);
  7184.  
  7185.     return result;
  7186. }
  7187.  
  7188. /*==============================================================================
  7189.  *    MF3D_ObjPhongIlluminationWriter
  7190.  *==============================================================================
  7191.  */
  7192. MF3DErr
  7193. MF3D_ObjPhongIlluminationWriter(
  7194.     MF3D_FilePtr    inMetafilePtr,
  7195.     MF3DVoidObjPtr    inObj)
  7196. {
  7197.     MF3D_VerifyObjectType(inObj, kMF3DObjPhongIllumination);
  7198.     MF3D_Unused(inMetafilePtr);
  7199.     MF3D_Unused(inObj);
  7200.     /* Nothing to write! */
  7201.     return kMF3DNoErr;
  7202. }
  7203.  
  7204. /*==============================================================================
  7205.  *    MF3D_ObjPhongIlluminationDisposer
  7206.  *==============================================================================
  7207.  */
  7208. MF3DErr
  7209. MF3D_ObjPhongIlluminationDisposer(
  7210.     MF3DVoidObjPtr    inObj)
  7211. {
  7212.     MF3D_VerifyObjectType(inObj, kMF3DObjPhongIllumination);
  7213.  
  7214.     MF3D_Free(inObj);
  7215.     return kMF3DNoErr;
  7216. }
  7217.  
  7218. /*==============================================================================
  7219.  *    MF3D_ObjTextureShaderReader
  7220.  *==============================================================================
  7221.  */
  7222. MF3DErr
  7223. MF3D_ObjTextureShaderReader(
  7224.     MF3D_FilePtr    inMetafilePtr,
  7225.     MF3DVoidObjPtr    *outObj)
  7226. {
  7227.     MF3DTextureShaderObjPtr        returnObj;
  7228.     MF3DErr                        result;
  7229.  
  7230.     MF3D_Unused(inMetafilePtr);
  7231.     result = kMF3DNoErr;
  7232.  
  7233.     MF3D_Allocate(returnObj);
  7234.  
  7235.     if (result == kMF3DNoErr)
  7236.         *outObj = (MF3DVoidObjPtr) returnObj;
  7237.     else
  7238.         MF3D_Free(returnObj);
  7239.  
  7240.     return result;
  7241. }
  7242.  
  7243. /*==============================================================================
  7244.  *    MF3D_ObjTextureShaderWriter
  7245.  *==============================================================================
  7246.  */
  7247. MF3DErr
  7248. MF3D_ObjTextureShaderWriter(
  7249.     MF3D_FilePtr    inMetafilePtr,
  7250.     MF3DVoidObjPtr    inObj)
  7251. {
  7252.     MF3D_VerifyObjectType(inObj, kMF3DObjTextureShader);
  7253.     MF3D_Unused(inMetafilePtr);
  7254.     MF3D_Unused(inObj);
  7255.     /* Nothing to write! */
  7256.     return kMF3DNoErr;
  7257. }
  7258.  
  7259. /*==============================================================================
  7260.  *    MF3D_ObjTextureShaderDisposer
  7261.  *==============================================================================
  7262.  */
  7263. MF3DErr
  7264. MF3D_ObjTextureShaderDisposer(
  7265.     MF3DVoidObjPtr    inObj)
  7266. {
  7267.     MF3D_VerifyObjectType(inObj, kMF3DObjTextureShader);
  7268.  
  7269.     MF3D_Free(inObj);
  7270.     return kMF3DNoErr;
  7271. }
  7272.  
  7273.  
  7274. #if defined(applec) || defined(__MWERKS__) || defined(THINK_C)
  7275. #pragma segment __MFOBJECT4__
  7276. #endif
  7277.  
  7278.  
  7279. /*==============================================================================
  7280.  *    MF3D_ObjBackfacingStyleReader
  7281.  *==============================================================================
  7282.  */
  7283. MF3DErr
  7284. MF3D_ObjBackfacingStyleReader(
  7285.     MF3D_FilePtr    inMetafilePtr,
  7286.     MF3DVoidObjPtr    *outObj)
  7287. {
  7288.     MF3DBackfacingStyleObjPtr    returnObj;
  7289.     MF3DErr                        result;
  7290.  
  7291.     result = kMF3DNoErr;
  7292.  
  7293.     MF3D_Allocate(returnObj);
  7294.  
  7295.     if (result == kMF3DNoErr)
  7296.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_BackfacingEnum,
  7297.                 &returnObj->backfacing);
  7298.     }
  7299.  
  7300.     if (result == kMF3DNoErr)
  7301.         *outObj = (MF3DVoidObjPtr) returnObj;
  7302.     else
  7303.         MF3D_Free(returnObj);
  7304.  
  7305.     return result;
  7306. }
  7307.  
  7308. /*==============================================================================
  7309.  *    MF3D_ObjBackfacingStyleWriter
  7310.  *==============================================================================
  7311.  */
  7312. MF3DErr
  7313. MF3D_ObjBackfacingStyleWriter(
  7314.     MF3D_FilePtr    inMetafilePtr,
  7315.     MF3DVoidObjPtr    inObj)
  7316. {
  7317.     MF3D_VerifyObjectType(inObj, kMF3DObjBackfacingStyle);
  7318.     return MF3D_EnumWrite(inMetafilePtr, gMF3D_BackfacingEnum,
  7319.             ((MF3DBackfacingStyleObjPtr)inObj)->backfacing);
  7320. }
  7321.  
  7322. /*==============================================================================
  7323.  *    MF3D_ObjBackfacingStyleDisposer
  7324.  *==============================================================================
  7325.  */
  7326. MF3DErr
  7327. MF3D_ObjBackfacingStyleDisposer(
  7328.     MF3DVoidObjPtr    inObj)
  7329. {
  7330.     MF3D_VerifyObjectType(inObj, kMF3DObjBackfacingStyle);
  7331.  
  7332.     MF3D_Free(inObj);
  7333.     return kMF3DNoErr;
  7334. }
  7335.  
  7336. /*==============================================================================
  7337.  *    MF3D_ObjFillStyleReader
  7338.  *==============================================================================
  7339.  */
  7340. MF3DErr
  7341. MF3D_ObjFillStyleReader(
  7342.     MF3D_FilePtr    inMetafilePtr,
  7343.     MF3DVoidObjPtr    *outObj)
  7344. {
  7345.     MF3DFillStyleObjPtr            returnObj;
  7346.     MF3DErr                        result;
  7347.  
  7348.     result = kMF3DNoErr;
  7349.  
  7350.     MF3D_Allocate(returnObj);
  7351.  
  7352.     if (result == kMF3DNoErr)
  7353.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_FillStyleEnum,
  7354.                 &returnObj->fillStyle);
  7355.     }
  7356.  
  7357.     if (result == kMF3DNoErr)
  7358.         *outObj = (MF3DVoidObjPtr) returnObj;
  7359.     else
  7360.         MF3D_Free(returnObj);
  7361.  
  7362.     return result;
  7363. }
  7364.  
  7365. /*==============================================================================
  7366.  *    MF3D_ObjFillStyleWriter
  7367.  *==============================================================================
  7368.  */
  7369. MF3DErr
  7370. MF3D_ObjFillStyleWriter(
  7371.     MF3D_FilePtr    inMetafilePtr,
  7372.     MF3DVoidObjPtr    inObj)
  7373. {
  7374.     MF3D_VerifyObjectType(inObj, kMF3DObjFillStyle);
  7375.     return MF3D_EnumWrite(inMetafilePtr, gMF3D_FillStyleEnum,
  7376.             ((MF3DFillStyleObjPtr)inObj)->fillStyle);
  7377. }
  7378.  
  7379. /*==============================================================================
  7380.  *    MF3D_ObjFillStyleDisposer
  7381.  *==============================================================================
  7382.  */
  7383. MF3DErr
  7384. MF3D_ObjFillStyleDisposer(
  7385.     MF3DVoidObjPtr    inObj)
  7386. {
  7387.     MF3D_VerifyObjectType(inObj, kMF3DObjFillStyle);
  7388.  
  7389.     MF3D_Free(inObj);
  7390.     return kMF3DNoErr;
  7391. }
  7392.  
  7393. /*==============================================================================
  7394.  *    MF3D_ObjHighlightStyleReader
  7395.  *==============================================================================
  7396.  */
  7397. MF3DErr
  7398. MF3D_ObjHighlightStyleReader(
  7399.     MF3D_FilePtr    inMetafilePtr,
  7400.     MF3DVoidObjPtr    *outObj)
  7401. {
  7402.     MF3DHighlightStyleObjPtr    returnObj;
  7403.     MF3DErr                        result;
  7404.  
  7405.     MF3D_Unused(inMetafilePtr);
  7406.     result = kMF3DNoErr;
  7407.  
  7408.     MF3D_Allocate(returnObj);
  7409.  
  7410.     if (result == kMF3DNoErr)
  7411.         *outObj = (MF3DVoidObjPtr) returnObj;
  7412.     else
  7413.         MF3D_Free(returnObj);
  7414.  
  7415.     return result;
  7416. }
  7417.  
  7418. /*==============================================================================
  7419.  *    MF3D_ObjHighlightStyleWriter
  7420.  *==============================================================================
  7421.  */
  7422. MF3DErr
  7423. MF3D_ObjHighlightStyleWriter(
  7424.     MF3D_FilePtr    inMetafilePtr,
  7425.     MF3DVoidObjPtr    inObj)
  7426. {
  7427.     MF3D_VerifyObjectType(inObj, kMF3DObjHighlightStyle);
  7428.     MF3D_Unused(inMetafilePtr);
  7429.     MF3D_Unused(inObj);
  7430.     /* Nothing to write! */
  7431.     return kMF3DNoErr;
  7432. }
  7433.  
  7434. /*==============================================================================
  7435.  *    MF3D_ObjHighlightStyleDisposer
  7436.  *==============================================================================
  7437.  */
  7438. MF3DErr
  7439. MF3D_ObjHighlightStyleDisposer(
  7440.     MF3DVoidObjPtr    inObj)
  7441. {
  7442.     MF3D_VerifyObjectType(inObj, kMF3DObjHighlightStyle);
  7443.  
  7444.     MF3D_Free(inObj);
  7445.     return kMF3DNoErr;
  7446. }
  7447.  
  7448. /*==============================================================================
  7449.  *    MF3D_ObjInterpolationStyleReader
  7450.  *==============================================================================
  7451.  */
  7452. MF3DErr
  7453. MF3D_ObjInterpolationStyleReader(
  7454.     MF3D_FilePtr    inMetafilePtr,
  7455.     MF3DVoidObjPtr    *outObj)
  7456. {
  7457.     MF3DInterpolationStyleObjPtr    returnObj;
  7458.     MF3DErr                            result;
  7459.  
  7460.     result = kMF3DNoErr;
  7461.  
  7462.     MF3D_Allocate(returnObj);
  7463.  
  7464.     if (result == kMF3DNoErr)
  7465.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_InterpolationStyleEnum,
  7466.                 &returnObj->interpolationStyle);
  7467.     }
  7468.  
  7469.     if (result == kMF3DNoErr)
  7470.         *outObj = (MF3DVoidObjPtr) returnObj;
  7471.     else
  7472.         MF3D_Free(returnObj);
  7473.  
  7474.     return result;
  7475. }
  7476.  
  7477. /*==============================================================================
  7478.  *    MF3D_ObjInterpolationStyleWriter
  7479.  *==============================================================================
  7480.  */
  7481. MF3DErr
  7482. MF3D_ObjInterpolationStyleWriter(
  7483.     MF3D_FilePtr    inMetafilePtr,
  7484.     MF3DVoidObjPtr    inObj)
  7485. {
  7486.     MF3D_VerifyObjectType(inObj, kMF3DObjInterpolationStyle);
  7487.     return MF3D_EnumWrite(inMetafilePtr, gMF3D_InterpolationStyleEnum,
  7488.                 ((MF3DInterpolationStyleObjPtr)inObj)->interpolationStyle);
  7489. }
  7490.  
  7491. /*==============================================================================
  7492.  *    MF3D_ObjInterpolationStyleDisposer
  7493.  *==============================================================================
  7494.  */
  7495. MF3DErr
  7496. MF3D_ObjInterpolationStyleDisposer(
  7497.     MF3DVoidObjPtr    inObj)
  7498. {
  7499.     MF3D_VerifyObjectType(inObj, kMF3DObjInterpolationStyle);
  7500.  
  7501.     MF3D_Free(inObj);
  7502.     return kMF3DNoErr;
  7503. }
  7504.  
  7505. /*==============================================================================
  7506.  *    MF3D_ObjOrientationStyleReader
  7507.  *==============================================================================
  7508.  */
  7509. MF3DErr
  7510. MF3D_ObjOrientationStyleReader(
  7511.     MF3D_FilePtr    inMetafilePtr,
  7512.     MF3DVoidObjPtr    *outObj)
  7513. {
  7514.     MF3DOrientationStyleObjPtr    returnObj;
  7515.     MF3DErr                        result;
  7516.  
  7517.     result = kMF3DNoErr;
  7518.  
  7519.     MF3D_Allocate(returnObj);
  7520.  
  7521.     if (result == kMF3DNoErr)
  7522.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_OrientationStyleEnum,
  7523.                 &returnObj->orientationStyle);
  7524.     }
  7525.  
  7526.     if (result == kMF3DNoErr)
  7527.         *outObj = (MF3DVoidObjPtr) returnObj;
  7528.     else
  7529.         MF3D_Free(returnObj);
  7530.  
  7531.     return result;
  7532. }
  7533.  
  7534. /*==============================================================================
  7535.  *    MF3D_ObjOrientationStyleWriter
  7536.  *==============================================================================
  7537.  */
  7538. MF3DErr
  7539. MF3D_ObjOrientationStyleWriter(
  7540.     MF3D_FilePtr    inMetafilePtr,
  7541.     MF3DVoidObjPtr    inObj)
  7542. {
  7543.     MF3D_VerifyObjectType(inObj, kMF3DObjOrientationStyle);
  7544.     return MF3D_EnumWrite(inMetafilePtr, gMF3D_OrientationStyleEnum,
  7545.                 ((MF3DOrientationStyleObjPtr)inObj)->orientationStyle);
  7546. }
  7547.  
  7548. /*==============================================================================
  7549.  *    MF3D_ObjOrientationStyleDisposer
  7550.  *==============================================================================
  7551.  */
  7552. MF3DErr
  7553. MF3D_ObjOrientationStyleDisposer(
  7554.     MF3DVoidObjPtr    inObj)
  7555. {
  7556.     MF3D_VerifyObjectType(inObj, kMF3DObjOrientationStyle);
  7557.  
  7558.     MF3D_Free(inObj);
  7559.     return kMF3DNoErr;
  7560. }
  7561.  
  7562. /*==============================================================================
  7563.  *    MF3D_ObjPickIDStyleReader
  7564.  *==============================================================================
  7565.  */
  7566. MF3DErr
  7567. MF3D_ObjPickIDStyleReader(
  7568.     MF3D_FilePtr    inMetafilePtr,
  7569.     MF3DVoidObjPtr    *outObj)
  7570. {
  7571.     MF3DPickIDStyleObjPtr        returnObj;
  7572.     MF3DErr                        result;
  7573.  
  7574.     result = kMF3DNoErr;
  7575.  
  7576.     MF3D_Allocate(returnObj);
  7577.  
  7578.     if (result == kMF3DNoErr)
  7579.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->id);
  7580.  
  7581.     if (result == kMF3DNoErr)
  7582.         *outObj = (MF3DVoidObjPtr) returnObj;
  7583.     else
  7584.         MF3D_Free(returnObj);
  7585.  
  7586.     return result;
  7587. }
  7588.  
  7589. /*==============================================================================
  7590.  *    MF3D_ObjPickIDStyleWriter
  7591.  *==============================================================================
  7592.  */
  7593. MF3DErr
  7594. MF3D_ObjPickIDStyleWriter(
  7595.     MF3D_FilePtr    inMetafilePtr,
  7596.     MF3DVoidObjPtr    inObj)
  7597. {
  7598.     MF3D_VerifyObjectType(inObj, kMF3DObjPickIDStyle);
  7599.     return MF3D_Uns32Write(inMetafilePtr, ((MF3DPickIDStyleObjPtr)inObj)->id);
  7600. }
  7601.  
  7602. /*==============================================================================
  7603.  *    MF3D_ObjPickIDStyleDisposer
  7604.  *==============================================================================
  7605.  */
  7606. MF3DErr
  7607. MF3D_ObjPickIDStyleDisposer(
  7608.     MF3DVoidObjPtr    inObj)
  7609. {
  7610.     MF3D_VerifyObjectType(inObj, kMF3DObjPickIDStyle);
  7611.  
  7612.     MF3D_Free(inObj);
  7613.     return kMF3DNoErr;
  7614. }
  7615.  
  7616. /*==============================================================================
  7617.  *    MF3D_ObjPickPartsStyleReader
  7618.  *==============================================================================
  7619.  */
  7620. MF3DErr
  7621. MF3D_ObjPickPartsStyleReader(
  7622.     MF3D_FilePtr    inMetafilePtr,
  7623.     MF3DVoidObjPtr    *outObj)
  7624. {
  7625.     MF3DPickPartsStyleObjPtr    returnObj;
  7626.     MF3DErr                        result;
  7627.  
  7628.     result = kMF3DNoErr;
  7629.  
  7630.     MF3D_Allocate(returnObj);
  7631.  
  7632.     if (result == kMF3DNoErr)
  7633.     {    result = MF3D_FlagsRead(inMetafilePtr, gMF3D_PickPartsFlags,
  7634.                 &returnObj->pickParts);
  7635.     }
  7636.  
  7637.     if (result == kMF3DNoErr)
  7638.         *outObj = (MF3DVoidObjPtr) returnObj;
  7639.     else
  7640.         MF3D_Free(returnObj);
  7641.  
  7642.     return result;
  7643. }
  7644.  
  7645. /*==============================================================================
  7646.  *    MF3D_ObjPickPartsStyleWriter
  7647.  *==============================================================================
  7648.  */
  7649. MF3DErr
  7650. MF3D_ObjPickPartsStyleWriter(
  7651.     MF3D_FilePtr    inMetafilePtr,
  7652.     MF3DVoidObjPtr    inObj)
  7653. {
  7654.     MF3D_VerifyObjectType(inObj, kMF3DObjPickPartsStyle);
  7655.     return MF3D_FlagsWrite(inMetafilePtr, gMF3D_PickPartsFlags,
  7656.             ((MF3DPickPartsStyleObjPtr)inObj)->pickParts);
  7657. }
  7658.  
  7659. /*==============================================================================
  7660.  *    MF3D_ObjPickPartsStyleDisposer
  7661.  *==============================================================================
  7662.  */
  7663. MF3DErr
  7664. MF3D_ObjPickPartsStyleDisposer(
  7665.     MF3DVoidObjPtr    inObj)
  7666. {
  7667.     MF3D_VerifyObjectType(inObj, kMF3DObjPickPartsStyle);
  7668.  
  7669.     MF3D_Free(inObj);
  7670.     return kMF3DNoErr;
  7671. }
  7672.  
  7673. /*==============================================================================
  7674.  *    MF3D_ObjReceiveShadowsStyleReader
  7675.  *==============================================================================
  7676.  */
  7677. MF3DErr
  7678. MF3D_ObjReceiveShadowsStyleReader(
  7679.     MF3D_FilePtr    inMetafilePtr,
  7680.     MF3DVoidObjPtr    *outObj)
  7681. {
  7682.     MF3DReceiveShadowsStyleObjPtr    returnObj;
  7683.     MF3DErr                        result;
  7684.  
  7685.     result = kMF3DNoErr;
  7686.  
  7687.     MF3D_Allocate(returnObj);
  7688.  
  7689.     if (result == kMF3DNoErr)
  7690.         result = MF3D_BooleanRead(inMetafilePtr, &returnObj->receiveShadows);
  7691.  
  7692.     if (result == kMF3DNoErr)
  7693.         *outObj = (MF3DVoidObjPtr) returnObj;
  7694.     else
  7695.         MF3D_Free(returnObj);
  7696.  
  7697.     return result;
  7698. }
  7699.  
  7700. /*==============================================================================
  7701.  *    MF3D_ObjReceiveShadowsStyleWriter
  7702.  *==============================================================================
  7703.  */
  7704. MF3DErr
  7705. MF3D_ObjReceiveShadowsStyleWriter(
  7706.     MF3D_FilePtr    inMetafilePtr,
  7707.     MF3DVoidObjPtr    inObj)
  7708. {
  7709.     MF3D_VerifyObjectType(inObj, kMF3DObjReceiveShadowsStyle);
  7710.     return MF3D_BooleanWrite(inMetafilePtr,
  7711.             ((MF3DReceiveShadowsStyleObjPtr)inObj)->receiveShadows);
  7712. }
  7713.  
  7714. /*==============================================================================
  7715.  *    MF3D_ObjReceiveShadowsStyleDisposer
  7716.  *==============================================================================
  7717.  */
  7718. MF3DErr
  7719. MF3D_ObjReceiveShadowsStyleDisposer(
  7720.     MF3DVoidObjPtr    inObj)
  7721. {
  7722.     MF3D_VerifyObjectType(inObj, kMF3DObjReceiveShadowsStyle);
  7723.  
  7724.     MF3D_Free(inObj);
  7725.     return kMF3DNoErr;
  7726. }
  7727.  
  7728. /*==============================================================================
  7729.  *    MF3D_ObjSubdivisionStyleReader
  7730.  *==============================================================================
  7731.  */
  7732. MF3DErr
  7733. MF3D_ObjSubdivisionStyleReader(
  7734.     MF3D_FilePtr    inMetafilePtr,
  7735.     MF3DVoidObjPtr    *outObj)
  7736. {
  7737.     MF3DSubdivisionStyleObjPtr    returnObj;
  7738.     MF3DErr                        result;
  7739.  
  7740.     result = kMF3DNoErr;
  7741.  
  7742.     MF3D_Allocate(returnObj);
  7743.  
  7744.     if (result == kMF3DNoErr)
  7745.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_SubdivisionMethodEnum,
  7746.                 &returnObj->subdivisionMethod);
  7747.     }
  7748.  
  7749.     if (result == kMF3DNoErr)
  7750.     {    if (returnObj->subdivisionMethod == MF3DSubdivisionConstant)
  7751.         {    result = MF3D_Uns32Read(inMetafilePtr,
  7752.                     &returnObj->subdivisionData.constant.value1);
  7753.             if (result == kMF3DNoErr)
  7754.             {    result = MF3D_Uns32Read(inMetafilePtr,
  7755.                         &returnObj->subdivisionData.constant.value2);
  7756.             }
  7757.         }
  7758.         else
  7759.         {    MFASSERT(returnObj->subdivisionMethod ==
  7760.                     MF3DSubdivisionWorldSpace ||
  7761.                     returnObj->subdivisionMethod ==
  7762.                     MF3DSubdivisionScreenSpace);
  7763.  
  7764.             result = MF3D_Float32Read(inMetafilePtr,
  7765.                     &returnObj->subdivisionData.space.value1);
  7766.         }
  7767.     }
  7768.  
  7769.     if (result == kMF3DNoErr)
  7770.         *outObj = (MF3DVoidObjPtr) returnObj;
  7771.     else
  7772.         MF3D_Free(returnObj);
  7773.  
  7774.     return result;
  7775. }
  7776.  
  7777. /*==============================================================================
  7778.  *    MF3D_ObjSubdivisionStyleWriter
  7779.  *==============================================================================
  7780.  */
  7781. MF3DErr
  7782. MF3D_ObjSubdivisionStyleWriter(
  7783.     MF3D_FilePtr    inMetafilePtr,
  7784.     MF3DVoidObjPtr    inObj)
  7785. {
  7786.     MF3DSubdivisionStyleObjPtr    writeObj;
  7787.     MF3DErr                        result;
  7788.  
  7789.     MF3D_VerifyObjectType(inObj, kMF3DObjSubdivisionStyle);
  7790.     writeObj = (MF3DSubdivisionStyleObjPtr)inObj;
  7791.  
  7792.     result = MF3D_EnumWrite(inMetafilePtr, gMF3D_SubdivisionMethodEnum,
  7793.             writeObj->subdivisionMethod);
  7794.  
  7795.     if (result == kMF3DNoErr)
  7796.     {    if (writeObj->subdivisionMethod == MF3DSubdivisionConstant)
  7797.         {    result = MF3D_Uns32Write(inMetafilePtr,
  7798.                     writeObj->subdivisionData.constant.value1);
  7799.             if (result == kMF3DNoErr)
  7800.             {    result = MF3D_Uns32Write(inMetafilePtr,
  7801.                         writeObj->subdivisionData.constant.value2);
  7802.             }
  7803.         }
  7804.         else
  7805.         {    MFASSERT(writeObj->subdivisionMethod ==
  7806.                     MF3DSubdivisionWorldSpace ||
  7807.                     writeObj->subdivisionMethod ==
  7808.                     MF3DSubdivisionScreenSpace);
  7809.  
  7810.             result = MF3D_Float32Write(inMetafilePtr,
  7811.                     writeObj->subdivisionData.space.value1);
  7812.         }
  7813.     }
  7814.  
  7815.     return result;
  7816. }
  7817.  
  7818. /*==============================================================================
  7819.  *    MF3D_ObjSubdivisionStyleDisposer
  7820.  *==============================================================================
  7821.  */
  7822. MF3DErr
  7823. MF3D_ObjSubdivisionStyleDisposer(
  7824.     MF3DVoidObjPtr    inObj)
  7825. {
  7826.     MF3D_VerifyObjectType(inObj, kMF3DObjSubdivisionStyle);
  7827.  
  7828.     MF3D_Free(inObj);
  7829.     return kMF3DNoErr;
  7830. }
  7831.  
  7832. /*==============================================================================
  7833.  *    MF3D_ObjMatrixTransformReader
  7834.  *==============================================================================
  7835.  */
  7836. MF3DErr
  7837. MF3D_ObjMatrixTransformReader(
  7838.     MF3D_FilePtr    inMetafilePtr,
  7839.     MF3DVoidObjPtr    *outObj)
  7840. {
  7841.     MF3DMatrixObjPtr        returnObj;
  7842.     MF3DErr                    result;
  7843.  
  7844.     result = kMF3DNoErr;
  7845.  
  7846.     MF3D_Allocate(returnObj);
  7847.  
  7848.     if (result == kMF3DNoErr)
  7849.         result = MF3D_Matrix4x4Read(inMetafilePtr, returnObj->matrix);
  7850.  
  7851.     if (result == kMF3DNoErr)
  7852.         *outObj = (MF3DVoidObjPtr) returnObj;
  7853.     else
  7854.         MF3D_Free(returnObj);
  7855.  
  7856.     return result;
  7857. }
  7858.  
  7859. /*==============================================================================
  7860.  *    MF3D_ObjMatrixTransformWriter
  7861.  *==============================================================================
  7862.  */
  7863. MF3DErr
  7864. MF3D_ObjMatrixTransformWriter(
  7865.     MF3D_FilePtr    inMetafilePtr,
  7866.     MF3DVoidObjPtr    inObj)
  7867. {
  7868.     MF3D_VerifyObjectType(inObj, kMF3DObjMatrixTransform);
  7869.     MF3D_WriteNewLine(inMetafilePtr);
  7870.     return MF3D_Matrix4x4Write(inMetafilePtr, 
  7871.             ((MF3DMatrixObj *)inObj)->matrix);
  7872. }
  7873.  
  7874. /*==============================================================================
  7875.  *    MF3D_ObjMatrixTransformDisposer
  7876.  *==============================================================================
  7877.  */
  7878. MF3DErr
  7879. MF3D_ObjMatrixTransformDisposer(
  7880.     MF3DVoidObjPtr    inObj)
  7881. {
  7882.     MF3D_VerifyObjectType(inObj, kMF3DObjMatrixTransform);
  7883.  
  7884.     MF3D_Free(inObj);
  7885.     return kMF3DNoErr;
  7886. }
  7887.  
  7888. /*==============================================================================
  7889.  *    MF3D_ObjQuaternionTransformReader
  7890.  *==============================================================================
  7891.  */
  7892. MF3DErr
  7893. MF3D_ObjQuaternionTransformReader(
  7894.     MF3D_FilePtr    inMetafilePtr,
  7895.     MF3DVoidObjPtr    *outObj)
  7896. {
  7897.     MF3DQuaternionObjPtr        returnObj;
  7898.     MF3DErr                        result;
  7899.  
  7900.     result = kMF3DNoErr;
  7901.  
  7902.     MF3D_Allocate(returnObj);
  7903.  
  7904.     if (result == kMF3DNoErr)
  7905.         result = MF3D_QuaternionRead(inMetafilePtr, &returnObj->quaternion);
  7906.  
  7907.     if (result == kMF3DNoErr)
  7908.         *outObj = (MF3DVoidObjPtr) returnObj;
  7909.     else
  7910.         MF3D_Free(returnObj);
  7911.  
  7912.     return result;
  7913. }
  7914.  
  7915. /*==============================================================================
  7916.  *    MF3D_ObjQuaternionTransformWriter
  7917.  *==============================================================================
  7918.  */
  7919. MF3DErr
  7920. MF3D_ObjQuaternionTransformWriter(
  7921.     MF3D_FilePtr    inMetafilePtr,
  7922.     MF3DVoidObjPtr    inObj)
  7923. {
  7924.     MF3D_VerifyObjectType(inObj, kMF3DObjQuaternionTransform);
  7925.     return MF3D_QuaternionWrite(inMetafilePtr,
  7926.             ((MF3DQuaternionObjPtr)inObj)->quaternion);
  7927. }
  7928.  
  7929. /*==============================================================================
  7930.  *    MF3D_ObjQuaternionTransformDisposer
  7931.  *==============================================================================
  7932.  */
  7933. MF3DErr
  7934. MF3D_ObjQuaternionTransformDisposer(
  7935.     MF3DVoidObjPtr    inObj)
  7936. {
  7937.     MF3D_VerifyObjectType(inObj, kMF3DObjQuaternionTransform);
  7938.  
  7939.     MF3D_Free(inObj);
  7940.     return kMF3DNoErr;
  7941. }
  7942.  
  7943. /*==============================================================================
  7944.  *    MF3D_ObjRotateTransformReader
  7945.  *==============================================================================
  7946.  */
  7947. MF3DErr
  7948. MF3D_ObjRotateTransformReader(
  7949.     MF3D_FilePtr    inMetafilePtr,
  7950.     MF3DVoidObjPtr    *outObj)
  7951. {
  7952.     MF3DRotateObjPtr            returnObj;
  7953.     MF3DErr                        result;
  7954.  
  7955.     result = kMF3DNoErr;
  7956.  
  7957.     MF3D_Allocate(returnObj);
  7958.  
  7959.     if (result == kMF3DNoErr)
  7960.         result = MF3D_EnumRead(inMetafilePtr, gMF3D_AxisEnum, &returnObj->axis);
  7961.  
  7962.     if (result == kMF3DNoErr)
  7963.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->radians);
  7964.  
  7965.     if (result == kMF3DNoErr)
  7966.         *outObj = (MF3DVoidObjPtr) returnObj;
  7967.     else
  7968.         MF3D_Free(returnObj);
  7969.  
  7970.     return result;
  7971. }
  7972.  
  7973. /*==============================================================================
  7974.  *    MF3D_ObjRotateTransformWriter
  7975.  *==============================================================================
  7976.  */
  7977. MF3DErr
  7978. MF3D_ObjRotateTransformWriter(
  7979.     MF3D_FilePtr    inMetafilePtr,
  7980.     MF3DVoidObjPtr    inObj)
  7981. {
  7982.     MF3DRotateObjPtr            writeObj;
  7983.     MF3DErr                        result;
  7984.  
  7985.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateTransform);
  7986.     writeObj = (MF3DRotateObjPtr)inObj;
  7987.  
  7988.     result = MF3D_EnumWrite(inMetafilePtr, gMF3D_AxisEnum, writeObj->axis);
  7989.  
  7990.     if (result == kMF3DNoErr)
  7991.         result = MF3D_Float32Write(inMetafilePtr, writeObj->radians);
  7992.  
  7993.     return result;
  7994. }
  7995.  
  7996. /*==============================================================================
  7997.  *    MF3D_ObjRotateTransformDisposer
  7998.  *==============================================================================
  7999.  */
  8000. MF3DErr
  8001. MF3D_ObjRotateTransformDisposer(
  8002.     MF3DVoidObjPtr    inObj)
  8003. {
  8004.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateTransform);
  8005.  
  8006.     MF3D_Free(inObj);
  8007.     return kMF3DNoErr;
  8008. }
  8009.  
  8010. /*==============================================================================
  8011.  *    MF3D_ObjRotateAboutAxisTransformReader
  8012.  *==============================================================================
  8013.  */
  8014. MF3DErr
  8015. MF3D_ObjRotateAboutAxisTransformReader(
  8016.     MF3D_FilePtr    inMetafilePtr,
  8017.     MF3DVoidObjPtr    *outObj)
  8018. {
  8019.     MF3DRotateAboutAxisObjPtr    returnObj;
  8020.     MF3DErr                        result;
  8021.  
  8022.     result = kMF3DNoErr;
  8023.  
  8024.     MF3D_Allocate(returnObj);
  8025.  
  8026.     if (result == kMF3DNoErr)
  8027.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->origin);
  8028.  
  8029.     if (result == kMF3DNoErr)
  8030.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->orientation);
  8031.  
  8032.     if (result == kMF3DNoErr)
  8033.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->radians);
  8034.  
  8035.     if (result == kMF3DNoErr)
  8036.         *outObj = (MF3DVoidObjPtr) returnObj;
  8037.     else
  8038.         MF3D_Free(returnObj);
  8039.  
  8040.     return result;
  8041. }
  8042.  
  8043. /*==============================================================================
  8044.  *    MF3D_ObjRotateAboutAxisTransformWriter
  8045.  *==============================================================================
  8046.  */
  8047. MF3DErr
  8048. MF3D_ObjRotateAboutAxisTransformWriter(
  8049.     MF3D_FilePtr    inMetafilePtr,
  8050.     MF3DVoidObjPtr    inObj)
  8051. {
  8052.     MF3DRotateAboutAxisObjPtr    writeObj;
  8053.     MF3DErr                        result;
  8054.  
  8055.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateAboutAxisTransform);
  8056.     writeObj = (MF3DRotateAboutAxisObjPtr)inObj;
  8057.  
  8058.     result = MF3D_Point3DWrite(inMetafilePtr, writeObj->origin);
  8059.  
  8060.     if (result == kMF3DNoErr)
  8061.         result = MF3D_Vector3DWrite(inMetafilePtr, writeObj->orientation);
  8062.  
  8063.     if (result == kMF3DNoErr)
  8064.         result = MF3D_Float32Write(inMetafilePtr, writeObj->radians);
  8065.  
  8066.     return result;
  8067. }
  8068.  
  8069. /*==============================================================================
  8070.  *    MF3D_ObjRotateAboutAxisTransformDisposer
  8071.  *==============================================================================
  8072.  */
  8073. MF3DErr
  8074. MF3D_ObjRotateAboutAxisTransformDisposer(
  8075.     MF3DVoidObjPtr    inObj)
  8076. {
  8077.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateAboutAxisTransform);
  8078.  
  8079.     MF3D_Free(inObj);
  8080.     return kMF3DNoErr;
  8081. }
  8082.  
  8083. /*==============================================================================
  8084.  *    MF3D_ObjRotateAboutPointTransformReader
  8085.  *==============================================================================
  8086.  */
  8087. MF3DErr
  8088. MF3D_ObjRotateAboutPointTransformReader(
  8089.     MF3D_FilePtr    inMetafilePtr,
  8090.     MF3DVoidObjPtr    *outObj)
  8091. {
  8092.     MF3DRotateAboutPointObjPtr    returnObj;
  8093.     MF3DErr                        result;
  8094.  
  8095.     result = kMF3DNoErr;
  8096.  
  8097.     MF3D_Allocate(returnObj);
  8098.  
  8099.     if (result == kMF3DNoErr)
  8100.         result = MF3D_EnumRead(inMetafilePtr, gMF3D_AxisEnum, &returnObj->axis);
  8101.  
  8102.     if (result == kMF3DNoErr)
  8103.         result = MF3D_Float32Read(inMetafilePtr, &returnObj->radians);
  8104.  
  8105.     if (result == kMF3DNoErr)
  8106.         result = MF3D_Point3DRead(inMetafilePtr, &returnObj->origin);
  8107.  
  8108.     if (result == kMF3DNoErr)
  8109.         *outObj = (MF3DVoidObjPtr) returnObj;
  8110.     else
  8111.         MF3D_Free(returnObj);
  8112.  
  8113.     return result;
  8114. }
  8115.  
  8116. /*==============================================================================
  8117.  *    MF3D_ObjRotateAboutPointTransformWriter
  8118.  *==============================================================================
  8119.  */
  8120. MF3DErr
  8121. MF3D_ObjRotateAboutPointTransformWriter(
  8122.     MF3D_FilePtr    inMetafilePtr,
  8123.     MF3DVoidObjPtr    inObj)
  8124. {
  8125.     MF3DRotateAboutPointObjPtr    writeObj;
  8126.     MF3DErr                        result;
  8127.  
  8128.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateAboutPointTransform);
  8129.     writeObj = (MF3DRotateAboutPointObjPtr)inObj;
  8130.  
  8131.     result = MF3D_EnumWrite(inMetafilePtr, gMF3D_AxisEnum, writeObj->axis);
  8132.  
  8133.     if (result == kMF3DNoErr)
  8134.         result = MF3D_Float32Write(inMetafilePtr, writeObj->radians);
  8135.  
  8136.     if (result == kMF3DNoErr)
  8137.         result = MF3D_Point3DWrite(inMetafilePtr, writeObj->origin);
  8138.  
  8139.     return result;
  8140. }
  8141.  
  8142. /*==============================================================================
  8143.  *    MF3D_ObjRotateAboutPointTransformDisposer
  8144.  *==============================================================================
  8145.  */
  8146. MF3DErr
  8147. MF3D_ObjRotateAboutPointTransformDisposer(
  8148.     MF3DVoidObjPtr    inObj)
  8149. {
  8150.     MF3D_VerifyObjectType(inObj, kMF3DObjRotateAboutPointTransform);
  8151.  
  8152.     MF3D_Free(inObj);
  8153.     return kMF3DNoErr;
  8154. }
  8155.  
  8156. /*==============================================================================
  8157.  *    MF3D_ObjScaleTransformReader
  8158.  *==============================================================================
  8159.  */
  8160. MF3DErr
  8161. MF3D_ObjScaleTransformReader(
  8162.     MF3D_FilePtr    inMetafilePtr,
  8163.     MF3DVoidObjPtr    *outObj)
  8164. {
  8165.     MF3DScaleObjPtr                returnObj;
  8166.     MF3DErr                        result;
  8167.  
  8168.     result = kMF3DNoErr;
  8169.  
  8170.     MF3D_Allocate(returnObj);
  8171.  
  8172.     if (result == kMF3DNoErr)
  8173.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->scale);
  8174.  
  8175.     if (result == kMF3DNoErr)
  8176.         *outObj = (MF3DVoidObjPtr) returnObj;
  8177.     else
  8178.         MF3D_Free(returnObj);
  8179.  
  8180.     return result;
  8181. }
  8182.  
  8183. /*==============================================================================
  8184.  *    MF3D_ObjScaleTransformWriter
  8185.  *==============================================================================
  8186.  */
  8187. MF3DErr
  8188. MF3D_ObjScaleTransformWriter(
  8189.     MF3D_FilePtr    inMetafilePtr,
  8190.     MF3DVoidObjPtr    inObj)
  8191. {
  8192.     MF3D_VerifyObjectType(inObj, kMF3DObjScaleTransform);
  8193.     return MF3D_Vector3DWrite(inMetafilePtr,
  8194.             ((MF3DScaleObjPtr)inObj)->scale);
  8195. }
  8196.  
  8197. /*==============================================================================
  8198.  *    MF3D_ObjScaleTransformDisposer
  8199.  *==============================================================================
  8200.  */
  8201. MF3DErr
  8202. MF3D_ObjScaleTransformDisposer(
  8203.     MF3DVoidObjPtr    inObj)
  8204. {
  8205.     MF3D_VerifyObjectType(inObj, kMF3DObjScaleTransform);
  8206.  
  8207.     MF3D_Free(inObj);
  8208.     return kMF3DNoErr;
  8209. }
  8210.  
  8211. /*==============================================================================
  8212.  *    MF3D_ObjTranslateTransformReader
  8213.  *==============================================================================
  8214.  */
  8215. MF3DErr
  8216. MF3D_ObjTranslateTransformReader(
  8217.     MF3D_FilePtr    inMetafilePtr,
  8218.     MF3DVoidObjPtr    *outObj)
  8219. {
  8220.     MF3DTranslateObjPtr            returnObj;
  8221.     MF3DErr                        result;
  8222.  
  8223.     result = kMF3DNoErr;
  8224.  
  8225.     MF3D_Allocate(returnObj);
  8226.  
  8227.     if (result == kMF3DNoErr)
  8228.         result = MF3D_Vector3DRead(inMetafilePtr, &returnObj->translate);
  8229.  
  8230.     if (result == kMF3DNoErr)
  8231.         *outObj = (MF3DVoidObjPtr) returnObj;
  8232.     else
  8233.         MF3D_Free(returnObj);
  8234.  
  8235.     return result;
  8236. }
  8237.  
  8238. /*==============================================================================
  8239.  *    MF3D_ObjTranslateTransformWriter
  8240.  *==============================================================================
  8241.  */
  8242. MF3DErr
  8243. MF3D_ObjTranslateTransformWriter(
  8244.     MF3D_FilePtr    inMetafilePtr,
  8245.     MF3DVoidObjPtr    inObj)
  8246. {
  8247.     MF3D_VerifyObjectType(inObj, kMF3DObjTranslateTransform);
  8248.     return MF3D_Vector3DWrite(inMetafilePtr,
  8249.             ((MF3DTranslateObjPtr)inObj)->translate);
  8250. }
  8251.  
  8252. /*==============================================================================
  8253.  *    MF3D_ObjTranslateTransformDisposer
  8254.  *==============================================================================
  8255.  */
  8256. MF3DErr
  8257. MF3D_ObjTranslateTransformDisposer(
  8258.     MF3DVoidObjPtr    inObj)
  8259. {
  8260.     MF3D_VerifyObjectType(inObj, kMF3DObjTranslateTransform);
  8261.  
  8262.     MF3D_Free(inObj);
  8263.     return kMF3DNoErr;
  8264. }
  8265.  
  8266. /*==============================================================================
  8267.  *    MF3D_ObjMacintoshPathReader
  8268.  *==============================================================================
  8269.  */
  8270. MF3DErr
  8271. MF3D_ObjMacintoshPathReader(
  8272.     MF3D_FilePtr    inMetafilePtr,
  8273.     MF3DVoidObjPtr    *outObj)
  8274. {
  8275.     MF3DMacintoshPathObjPtr        returnObj;
  8276.     MF3DErr                        result;
  8277.  
  8278.     result = kMF3DNoErr;
  8279.  
  8280.     MF3D_Allocate(returnObj);
  8281.  
  8282.     if (result == kMF3DNoErr)
  8283.         result = MF3D_CStringRead(inMetafilePtr, &returnObj->pathName);
  8284.  
  8285.     if (result == kMF3DNoErr)
  8286.         *outObj = (MF3DVoidObjPtr) returnObj;
  8287.     else
  8288.         MF3D_Free(returnObj);
  8289.  
  8290.     return result;
  8291. }
  8292.  
  8293. /*==============================================================================
  8294.  *    MF3D_ObjMacintoshPathWriter
  8295.  *==============================================================================
  8296.  */
  8297. MF3DErr
  8298. MF3D_ObjMacintoshPathWriter(
  8299.     MF3D_FilePtr    inMetafilePtr,
  8300.     MF3DVoidObjPtr    inObj)
  8301. {
  8302.     MF3D_VerifyObjectType(inObj, kMF3DObjMacintoshPath);
  8303.     return MF3D_CStringWrite(inMetafilePtr,
  8304.             ((MF3DMacintoshPathObjPtr)inObj)->pathName);
  8305. }
  8306.  
  8307. /*==============================================================================
  8308.  *    MF3D_ObjMacintoshPathDisposer
  8309.  *==============================================================================
  8310.  */
  8311. MF3DErr
  8312. MF3D_ObjMacintoshPathDisposer(
  8313.     MF3DVoidObjPtr    inObj)
  8314. {
  8315.     MF3D_VerifyObjectType(inObj, kMF3DObjMacintoshPath);
  8316.  
  8317.     if (inObj != NULL)
  8318.     {    MF3D_Free(((MF3DMacintoshPathObjPtr)inObj)->pathName);
  8319.         MF3D_Free(inObj);
  8320.     }
  8321.     return kMF3DNoErr;
  8322. }
  8323.  
  8324. /*==============================================================================
  8325.  *    MF3D_ObjUnixPathReader
  8326.  *==============================================================================
  8327.  */
  8328. MF3DErr
  8329. MF3D_ObjUnixPathReader(
  8330.     MF3D_FilePtr    inMetafilePtr,
  8331.     MF3DVoidObjPtr    *outObj)
  8332. {
  8333.     MF3DUnixPathObjPtr            returnObj;
  8334.     MF3DErr                        result;
  8335.  
  8336.     result = kMF3DNoErr;
  8337.  
  8338.     MF3D_Allocate(returnObj);
  8339.  
  8340.     if (result == kMF3DNoErr)
  8341.         result = MF3D_CStringRead(inMetafilePtr, &returnObj->pathName);
  8342.  
  8343.     if (result == kMF3DNoErr)
  8344.         *outObj = (MF3DVoidObjPtr) returnObj;
  8345.     else
  8346.         MF3D_Free(returnObj);
  8347.  
  8348.     return result;
  8349. }
  8350.  
  8351. /*==============================================================================
  8352.  *    MF3D_ObjUnixPathWriter
  8353.  *==============================================================================
  8354.  */
  8355. MF3DErr
  8356. MF3D_ObjUnixPathWriter(
  8357.     MF3D_FilePtr    inMetafilePtr,
  8358.     MF3DVoidObjPtr    inObj)
  8359. {
  8360.     MF3D_VerifyObjectType(inObj, kMF3DObjUnixPath);
  8361.     return MF3D_CStringWrite(inMetafilePtr,
  8362.             ((MF3DUnixPathObjPtr)inObj)->pathName);
  8363. }
  8364.  
  8365. /*==============================================================================
  8366.  *    MF3D_ObjUnixPathDisposer
  8367.  *==============================================================================
  8368.  */
  8369. MF3DErr
  8370. MF3D_ObjUnixPathDisposer(
  8371.     MF3DVoidObjPtr    inObj)
  8372. {
  8373.     MF3D_VerifyObjectType(inObj, kMF3DObjUnixPath);
  8374.  
  8375.     if (inObj != NULL)
  8376.     {    MF3D_Free(((MF3DUnixPathObjPtr)inObj)->pathName);
  8377.         MF3D_Free(inObj);
  8378.     }
  8379.     return kMF3DNoErr;
  8380. }
  8381.  
  8382. /*==============================================================================
  8383.  *    MF3D_ObjCStringReader
  8384.  *==============================================================================
  8385.  */
  8386. MF3DErr
  8387. MF3D_ObjCStringReader(
  8388.     MF3D_FilePtr    inMetafilePtr,
  8389.     MF3DVoidObjPtr    *outObj)
  8390. {
  8391.     MF3DCStringObjPtr            returnObj;
  8392.     MF3DErr                        result;
  8393.  
  8394.     result = kMF3DNoErr;
  8395.  
  8396.     MF3D_Allocate(returnObj);
  8397.  
  8398.     if (result == kMF3DNoErr)
  8399.         result = MF3D_CStringRead(inMetafilePtr, &returnObj->cString);
  8400.  
  8401.     if (result == kMF3DNoErr)
  8402.         *outObj = (MF3DVoidObjPtr) returnObj;
  8403.     else
  8404.         MF3D_Free(returnObj);
  8405.  
  8406.     return result;
  8407. }
  8408.  
  8409. /*==============================================================================
  8410.  *    MF3D_ObjCStringWriter
  8411.  *==============================================================================
  8412.  */
  8413. MF3DErr
  8414. MF3D_ObjCStringWriter(
  8415.     MF3D_FilePtr    inMetafilePtr,
  8416.     MF3DVoidObjPtr    inObj)
  8417. {
  8418.     MF3D_VerifyObjectType(inObj, kMF3DObjCString);
  8419.     return MF3D_CStringWrite(inMetafilePtr,
  8420.             ((MF3DCStringObjPtr)inObj)->cString);
  8421. }
  8422.  
  8423. /*==============================================================================
  8424.  *    MF3D_ObjCStringDisposer
  8425.  *==============================================================================
  8426.  */
  8427. MF3DErr
  8428. MF3D_ObjCStringDisposer(
  8429.     MF3DVoidObjPtr    inObj)
  8430. {
  8431.     MF3D_VerifyObjectType(inObj, kMF3DObjCString);
  8432.  
  8433.     if (inObj != NULL)
  8434.     {    MF3D_Free(((MF3DCStringObjPtr)inObj)->cString);
  8435.         MF3D_Free(inObj);
  8436.     }
  8437.     return kMF3DNoErr;
  8438. }
  8439.  
  8440. /*==============================================================================
  8441.  *    MF3D_ObjUnicodeReader
  8442.  *==============================================================================
  8443.  */
  8444. MF3DErr
  8445. MF3D_ObjUnicodeReader(
  8446.     MF3D_FilePtr    inMetafilePtr,
  8447.     MF3DVoidObjPtr    *outObj)
  8448. {
  8449.     MF3DUnicodeObjPtr            returnObj;
  8450.     MF3DUns32                    rawDataSize;
  8451.     MF3DErr                        result;
  8452.  
  8453.     result = kMF3DNoErr;
  8454.  
  8455.     MF3D_Allocate(returnObj);
  8456.  
  8457.     if (result == kMF3DNoErr)
  8458.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->length);
  8459.  
  8460.     if (result == kMF3DNoErr)
  8461.     {    rawDataSize = returnObj->length;
  8462.         if (rawDataSize == 0)
  8463.         {    returnObj->unicode = NULL;
  8464.         }
  8465.         else
  8466.         {    returnObj->unicode = MF3D_Malloc(rawDataSize);
  8467.             if (returnObj->unicode == NULL)
  8468.                 result = kMF3DErrOutOfMemory;
  8469.         }
  8470.     }
  8471.  
  8472.     if (result == kMF3DNoErr)
  8473.     {    result = MF3D_RawDataRead(inMetafilePtr, rawDataSize,
  8474.                 returnObj->unicode);
  8475.         if (result != kMF3DNoErr)
  8476.             MF3D_Free(returnObj->unicode);
  8477.     }
  8478.  
  8479.     if (result == kMF3DNoErr)
  8480.         *outObj = (MF3DVoidObjPtr) returnObj;
  8481.     else
  8482.         MF3D_Free(returnObj);
  8483.  
  8484.     return result;
  8485. }
  8486.  
  8487. /*==============================================================================
  8488.  *    MF3D_ObjUnicodeWriter
  8489.  *==============================================================================
  8490.  */
  8491. MF3DErr
  8492. MF3D_ObjUnicodeWriter(
  8493.     MF3D_FilePtr    inMetafilePtr,
  8494.     MF3DVoidObjPtr    inObj)
  8495. {
  8496.     MF3DUnicodeObjPtr            writeObj;
  8497.     MF3DErr                        result;
  8498.  
  8499.     MF3D_VerifyObjectType(inObj, kMF3DObjUnicode);
  8500.     writeObj = (MF3DUnicodeObjPtr)inObj;
  8501.  
  8502.     result = kMF3DNoErr;
  8503.  
  8504.     if (writeObj->unicode != NULL)
  8505.     {    MF3D_WriteNewLine(inMetafilePtr);
  8506.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->length);
  8507.  
  8508.         if (result == kMF3DNoErr)
  8509.         {    result = MF3D_RawDataWrite(inMetafilePtr, writeObj->length,
  8510.                     writeObj->unicode);
  8511.         }
  8512.     }
  8513.  
  8514.     return result;
  8515. }
  8516.  
  8517. /*==============================================================================
  8518.  *    MF3D_ObjUnicodeDisposer
  8519.  *==============================================================================
  8520.  */
  8521. MF3DErr
  8522. MF3D_ObjUnicodeDisposer(
  8523.     MF3DVoidObjPtr    inObj)
  8524. {
  8525.     MF3D_VerifyObjectType(inObj, kMF3DObjUnicode);
  8526.  
  8527.     if (inObj != NULL)
  8528.     {    MF3D_Free(((MF3DUnicodeObjPtr)inObj)->unicode);
  8529.         MF3D_Free(inObj);
  8530.     }
  8531.     return kMF3DNoErr;
  8532. }
  8533.  
  8534. /*==============================================================================
  8535.  *    MF3D_ObjPixmapTextureReader
  8536.  *==============================================================================
  8537.  */
  8538. MF3DErr
  8539. MF3D_ObjPixmapTextureReader(
  8540.     MF3D_FilePtr    inMetafilePtr,
  8541.     MF3DVoidObjPtr    *outObj)
  8542. {
  8543.     MF3DPixmapTextureObjPtr        returnObj;
  8544.     MF3DUns32                    imageSize;
  8545.     MF3DErr                        result;
  8546.  
  8547.     result = kMF3DNoErr;
  8548.  
  8549.     MF3D_Allocate(returnObj);
  8550.  
  8551.     if (result == kMF3DNoErr)
  8552.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->width);
  8553.  
  8554.     if (result == kMF3DNoErr)
  8555.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->height);
  8556.  
  8557.     if (result == kMF3DNoErr)
  8558.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->rowBytes);
  8559.  
  8560.     if (result == kMF3DNoErr)
  8561.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->pixelSize);
  8562.  
  8563.     if (result == kMF3DNoErr)
  8564.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_PixelTypeEnum,
  8565.                 &returnObj->pixelType);
  8566.     }
  8567.  
  8568.     if (result == kMF3DNoErr)
  8569.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_EndianEnum,
  8570.                 &returnObj->bitOrder);
  8571.     }
  8572.  
  8573.     if (result == kMF3DNoErr)
  8574.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_EndianEnum,
  8575.                 &returnObj->byteOrder);
  8576.     }
  8577.  
  8578.     if (result == kMF3DNoErr)
  8579.     {    imageSize = returnObj->rowBytes * returnObj->height;
  8580.         if (imageSize == 0)
  8581.             result = kMF3DErrWidthOrHeightIsZero;
  8582.     }
  8583.  
  8584.     if (result == kMF3DNoErr)
  8585.     {    returnObj->image = MF3D_Malloc(imageSize);
  8586.         if (returnObj->image == NULL)
  8587.             result = kMF3DErrOutOfMemory;
  8588.     }
  8589.  
  8590.     if (result == kMF3DNoErr)
  8591.     {    result = MF3D_RawDataRead(inMetafilePtr, imageSize, returnObj->image);
  8592.         if (result != kMF3DNoErr)
  8593.             MF3D_Free(returnObj->image);
  8594.     }
  8595.  
  8596.     if (result == kMF3DNoErr)
  8597.         *outObj = (MF3DVoidObjPtr) returnObj;
  8598.     else
  8599.         MF3D_Free(returnObj);
  8600.  
  8601.     return result;
  8602. }
  8603.  
  8604. /*==============================================================================
  8605.  *    MF3D_ObjPixmapTextureWriter
  8606.  *==============================================================================
  8607.  */
  8608. MF3DErr
  8609. MF3D_ObjPixmapTextureWriter(
  8610.     MF3D_FilePtr    inMetafilePtr,
  8611.     MF3DVoidObjPtr    inObj)
  8612. {
  8613.     MF3DPixmapTextureObjPtr        writeObj;
  8614.     MF3DUns32                    imageSize;
  8615.     MF3DErr                        result;
  8616.  
  8617.     MF3D_VerifyObjectType(inObj, kMF3DObjPixmapTexture);
  8618.     writeObj = (MF3DPixmapTextureObjPtr)inObj;
  8619.  
  8620.     result = kMF3DNoErr;
  8621.  
  8622.     imageSize = writeObj->rowBytes * writeObj->height;
  8623.     if (imageSize == 0)
  8624.         result = kMF3DErrWidthOrHeightIsZero;
  8625.  
  8626.     if (result == kMF3DNoErr)
  8627.     {    MF3D_WriteNewLine(inMetafilePtr);
  8628.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->width);
  8629.     }
  8630.  
  8631.     if (result == kMF3DNoErr)
  8632.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->height);
  8633.  
  8634.     if (result == kMF3DNoErr)
  8635.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->rowBytes);
  8636.  
  8637.     if (result == kMF3DNoErr)
  8638.     {    MF3D_WriteNewLine(inMetafilePtr);
  8639.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->pixelSize);
  8640.     }
  8641.  
  8642.     if (result == kMF3DNoErr)
  8643.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_PixelTypeEnum,
  8644.                 writeObj->pixelType);
  8645.     }
  8646.  
  8647.     if (result == kMF3DNoErr)
  8648.     {    MF3D_WriteNewLine(inMetafilePtr);
  8649.         result = MF3D_EnumWrite(inMetafilePtr, gMF3D_EndianEnum,
  8650.                 writeObj->bitOrder);
  8651.     }
  8652.  
  8653.     if (result == kMF3DNoErr)
  8654.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_EndianEnum,
  8655.                 writeObj->byteOrder);
  8656.     }
  8657.  
  8658.     if (result == kMF3DNoErr)
  8659.     {    result = MF3D_RawDataWrite(inMetafilePtr, imageSize, writeObj->image);
  8660.     }
  8661.  
  8662.     return result;
  8663. }
  8664.  
  8665. /*==============================================================================
  8666.  *    MF3D_ObjPixmapTextureDisposer
  8667.  *==============================================================================
  8668.  */
  8669. MF3DErr
  8670. MF3D_ObjPixmapTextureDisposer(
  8671.     MF3DVoidObjPtr    inObj)
  8672. {
  8673.     MF3D_VerifyObjectType(inObj, kMF3DObjPixmapTexture);
  8674.  
  8675.     if (inObj != NULL)
  8676.     {    MF3D_Free(((MF3DPixmapTextureObjPtr)inObj)->image);
  8677.         MF3D_Free(inObj);
  8678.     }
  8679.     return kMF3DNoErr;
  8680. }
  8681.  
  8682. /*==============================================================================
  8683.  *    MF3D_ObjViewHintsReader
  8684.  *==============================================================================
  8685.  */
  8686. MF3DErr
  8687. MF3D_ObjViewHintsReader(
  8688.     MF3D_FilePtr    inMetafilePtr,
  8689.     MF3DVoidObjPtr    *outObj)
  8690. {
  8691.     MF3DViewHintsObjPtr            returnObj;
  8692.     MF3DErr                        result;
  8693.  
  8694.     MF3D_Unused(inMetafilePtr);
  8695.     result = kMF3DNoErr;
  8696.  
  8697.     MF3D_Allocate(returnObj);
  8698.  
  8699.     if (result == kMF3DNoErr)
  8700.         *outObj = (MF3DVoidObjPtr) returnObj;
  8701.     else
  8702.         MF3D_Free(returnObj);
  8703.  
  8704.     return result;
  8705. }
  8706.  
  8707. /*==============================================================================
  8708.  *    MF3D_ObjViewHintsWriter
  8709.  *==============================================================================
  8710.  */
  8711. MF3DErr
  8712. MF3D_ObjViewHintsWriter(
  8713.     MF3D_FilePtr    inMetafilePtr,
  8714.     MF3DVoidObjPtr    inObj)
  8715. {
  8716.     MF3D_VerifyObjectType(inObj, kMF3DObjViewHints);
  8717.     MF3D_Unused(inMetafilePtr);
  8718.     MF3D_Unused(inObj);
  8719.     /* Nothing to write! */
  8720.     return kMF3DNoErr;
  8721. }
  8722.  
  8723. /*==============================================================================
  8724.  *    MF3D_ObjViewHintsDisposer
  8725.  *==============================================================================
  8726.  */
  8727. MF3DErr
  8728. MF3D_ObjViewHintsDisposer(
  8729.     MF3DVoidObjPtr    inObj)
  8730. {
  8731.     MF3D_VerifyObjectType(inObj, kMF3DObjViewHints);
  8732.  
  8733.     MF3D_Free(inObj);
  8734.     return kMF3DNoErr;
  8735. }
  8736.  
  8737. /*==============================================================================
  8738.  *    MF3D_ObjUnknownBinaryReader
  8739.  *==============================================================================
  8740.  */
  8741. MF3DErr
  8742. MF3D_ObjUnknownBinaryReader(
  8743.     MF3D_FilePtr    inMetafilePtr,
  8744.     MF3DVoidObjPtr    *outObj)
  8745. {
  8746.     MF3DUnknownBinaryObjPtr        returnObj;
  8747.     MF3DErr                        result;
  8748.  
  8749.     result = kMF3DNoErr;
  8750.  
  8751.     MF3D_Allocate(returnObj);
  8752.  
  8753.     if (result == kMF3DNoErr)
  8754.         result = MF3D_Int32Read(inMetafilePtr, &returnObj->realObjectType);
  8755.  
  8756.     if (result == kMF3DNoErr)
  8757.         result = MF3D_Uns32Read(inMetafilePtr, &returnObj->realObjectSize);
  8758.  
  8759.     if (result == kMF3DNoErr)
  8760.     {    result = MF3D_EnumRead(inMetafilePtr, gMF3D_EndianEnum,
  8761.                 &returnObj->realObjectOrder);
  8762.     }
  8763.  
  8764.     if (result == kMF3DNoErr)
  8765.     {    returnObj->realObjectData = MF3D_Malloc(returnObj->realObjectSize);
  8766.         if (returnObj->realObjectData == NULL)
  8767.             result = kMF3DErrOutOfMemory;
  8768.     }
  8769.  
  8770.     if (result == kMF3DNoErr)
  8771.     {    result = MF3D_RawDataRead(inMetafilePtr, returnObj->realObjectSize,
  8772.                 returnObj->realObjectData);
  8773.         if (result != kMF3DNoErr)
  8774.             MF3D_Free(returnObj->realObjectData);
  8775.     }
  8776.  
  8777.     if (result == kMF3DNoErr)
  8778.         *outObj = (MF3DVoidObjPtr) returnObj;
  8779.     else
  8780.         MF3D_Free(returnObj);
  8781.  
  8782.     return result;
  8783. }
  8784.  
  8785. /*==============================================================================
  8786.  *    MF3D_ObjUnknownBinaryWriter
  8787.  *==============================================================================
  8788.  */
  8789. MF3DErr
  8790. MF3D_ObjUnknownBinaryWriter(
  8791.     MF3D_FilePtr    inMetafilePtr,
  8792.     MF3DVoidObjPtr    inObj)
  8793. {
  8794.     MF3DUnknownBinaryObjPtr        writeObj;
  8795.     MF3DErr                        result;
  8796.  
  8797.     MF3D_VerifyObjectType(inObj, kMF3DObjUnknownBinary);
  8798.     writeObj = (MF3DUnknownBinaryObjPtr)inObj;
  8799.  
  8800.     result = kMF3DNoErr;
  8801.  
  8802.     if (result == kMF3DNoErr)
  8803.     {    MF3D_WriteNewLine(inMetafilePtr);
  8804.         result = MF3D_Int32Write(inMetafilePtr, writeObj->realObjectType);
  8805.     }
  8806.  
  8807.     if (result == kMF3DNoErr)
  8808.         result = MF3D_Uns32Write(inMetafilePtr, writeObj->realObjectSize);
  8809.  
  8810.     if (result == kMF3DNoErr)
  8811.     {    result = MF3D_EnumWrite(inMetafilePtr, gMF3D_EndianEnum,
  8812.                 writeObj->realObjectOrder);
  8813.     }
  8814.  
  8815.     if (result == kMF3DNoErr)
  8816.     {    result = MF3D_RawDataWrite(inMetafilePtr, writeObj->realObjectSize,
  8817.                 writeObj->realObjectData);
  8818.     }
  8819.  
  8820.     return result;
  8821. }
  8822.  
  8823. /*==============================================================================
  8824.  *    MF3D_ObjUnknownBinaryDisposer
  8825.  *==============================================================================
  8826.  */
  8827. MF3DErr
  8828. MF3D_ObjUnknownBinaryDisposer(
  8829.     MF3DVoidObjPtr    inObj)
  8830. {
  8831.     MF3D_VerifyObjectType(inObj, kMF3DObjUnknownBinary);
  8832.  
  8833.     if (inObj != NULL)
  8834.     {    MF3D_Free(((MF3DUnknownBinaryObjPtr)inObj)->realObjectData);
  8835.         MF3D_Free(inObj);
  8836.     }
  8837.     return kMF3DNoErr;
  8838. }
  8839.  
  8840. /*==============================================================================
  8841.  *    MF3D_ObjUnknownReader
  8842.  *==============================================================================
  8843.  */
  8844. MF3DErr
  8845. MF3D_ObjUnknownReader(
  8846.     MF3D_FilePtr    inMetafilePtr,
  8847.     MF3DVoidObjPtr    *outObj)
  8848. {
  8849.     MF3DUnknownObjPtr        returnObj;
  8850.     char                    *bufPtr;
  8851.     MF3DUns32                bufferEnd;
  8852.     MF3DUns32                bufPos;
  8853.     MF3DErr                    result;
  8854.  
  8855.     result = kMF3DNoErr;
  8856.  
  8857.     MF3D_Allocate(returnObj);
  8858.  
  8859.     if (result == kMF3DNoErr)
  8860.     {    returnObj->dataFormat = inMetafilePtr->dataFormat;
  8861.         returnObj->realObjectName = NULL;
  8862.  
  8863.         bufPtr = inMetafilePtr->readBuffer.buf;
  8864.         bufPos = inMetafilePtr->readBuffer.bufPos;
  8865.         bufferEnd = inMetafilePtr->readBuffer.bufSize;
  8866.  
  8867.         if (MF3DIsTextFormat(inMetafilePtr->dataFormat))
  8868.         {    /* Do not include trailing ')' in text files */
  8869.             do { } while (bufPtr[--bufferEnd] != kMF3D_EndChar);
  8870.         }
  8871.  
  8872.         returnObj->size = bufferEnd - bufPos;
  8873.  
  8874.         inMetafilePtr->readBuffer.bufPos = bufferEnd;
  8875.  
  8876.         if (returnObj->size == 0)
  8877.             returnObj->data = NULL;
  8878.         else
  8879.         {    returnObj->data = MF3D_Malloc(returnObj->size);
  8880.             if (returnObj->data == NULL)
  8881.                 result = kMF3DErrOutOfMemory;
  8882.         }
  8883.     }
  8884.  
  8885.     /* Copy the contents, whatever they may be */
  8886.     if (result == kMF3DNoErr)
  8887.     {    memcpy(returnObj->data, &bufPtr[bufPos], returnObj->size);
  8888.     }
  8889.  
  8890.     if (result == kMF3DNoErr)
  8891.         *outObj = (MF3DVoidObjPtr) returnObj;
  8892.     else
  8893.         MF3D_Free(returnObj);
  8894.  
  8895.     return result;
  8896. }
  8897.  
  8898. /*==============================================================================
  8899.  *    MF3D_ObjUnknownWriter
  8900.  *==============================================================================
  8901.  */
  8902. MF3DErr
  8903. MF3D_ObjUnknownWriter(
  8904.     MF3D_FilePtr    inMetafilePtr,
  8905.     MF3DVoidObjPtr    inObj)
  8906. {
  8907.     MF3DUnknownObjPtr        writeObj;
  8908.     MF3DErr                    result;
  8909.  
  8910.     MF3D_VerifyObjectType(inObj, kMF3DObjUnknownType);
  8911.     writeObj = (MF3DUnknownObjPtr)inObj;
  8912.  
  8913.     MF3D_WriteNewLine(inMetafilePtr);
  8914.     result = MF3D_WriteProc(inMetafilePtr, writeObj->size, writeObj->data);
  8915.  
  8916.     if (inMetafilePtr->dataFormat != writeObj->dataFormat)
  8917.         result = kMF3DWarnWrongUnknownTypeFormat;
  8918.  
  8919.     return result;
  8920. }
  8921.  
  8922. /*==============================================================================
  8923.  *    MF3D_ObjUnknownDisposer
  8924.  *==============================================================================
  8925.  */
  8926. MF3DErr
  8927. MF3D_ObjUnknownDisposer(
  8928.     MF3DVoidObjPtr    inObj)
  8929. {
  8930.     MF3D_VerifyObjectType(inObj, kMF3DObjUnknownType);
  8931.  
  8932.     if (inObj != NULL)
  8933.     {    MF3D_Free(((MF3DUnknownObjPtr)inObj)->realObjectName);
  8934.         MF3D_Free(((MF3DUnknownObjPtr)inObj)->data);
  8935.         MF3D_Free(inObj);
  8936.     }
  8937.     return kMF3DNoErr;
  8938. }
  8939.